ทำ MAVEN Repositoty ด้วย NEXUS

ความหลากหลายทางชีวภาพ (ทางเทคโนโลยี)

ในปัจจุบันภาษาที่ใช้ในการเขียนโปรแกรมนั้นมีมากมายหลายภาษา ยิ่งเป็น Framework นี่ไม่ต้องพูดถึงครับ มีมากมายมหาศาล ซึ่งมันเหมือนจะดีนะครับแต่มันมีการศึกษาเกี่ยวกับการมีทางเลือกแล้วพบว่า ยิ่งคนเรามีทางเลือกมากเท่าไหร่ ยิ่งทำให้คนเราไม่ตัดสินใจที่จะเลือก หรือเลื่อนเวลาที่จะตัดสินใจออกไป ซึ่งมันเกิดจากเรากลัวว่าทางที่เราเลือกนั้นไม่ใช่ทางที่ดีที่สุด (ผมอ่านมาจากนิตยสาร Creative Thailand มีแจกฟรีที่หอศิลป์กรุงเทพ, อ่านออนไลน์ หรือสมัครสมาชิกก็ได้นะ เนื้อหาดีกว่าหนังสือพิมพ์บางฉบับเสียอีก) ซึ่งก็ตรงกับสถาการณ์ของโปรแกรมเมอร์ในปัจจุบัน คือ ภาษา , Framework, Database, Vendor ที่ให้บริการ แต่ละคนก็บอกข้อดีเย้ยอีกฝั่งแบบ โอ้พี่ขายของกันได้น่ากลัวจริงๆ การจะเริ่มเขียนโปรแกรมมันเลยแบบ “กูจะเขียนภาษาอะไรดีวะ แล้วจะใช้ Datbase อะไร Framework ไหน” ตามนิตยสารเขาบอกไว้ว่า ให้เลือกเลยครับ หาเหตุผลมาเลือก จากนั้นเขียนเหตุผลตัวโตๆๆๆๆๆ ไว้ จากนั้นเวลาเสียใจให้กลับมาอ่านว่าทำไม เราถึงเลือกทางเลือกนี้ แล้วอีกอย่างนึงที่ผมชอบคือ ก่อนจะเลือกทางเลือกไหนให้ยอมรับการที่จะเดินทางบนทางเลือกนั้น ถ้าคุณจะใช้ nodejs คุณก็ต้องพร้อมเจอการทำงานบบ Async ถ้าคุณจะเขียน Assembly คุณก็ต้องยอมรับที่จะอ่านเลขฐาน 16 ต้องจำ interrupt หมายเลขต่างๆ ต้องเข้าใจฮาร์ดแวร์และเข้าใจข้อจำกัดต่างๆ ถ้าเทียบกับชีวิตจริง ถ้าอยากเป็นเจ้านายตัวเอง คุณต้องยอมรับให้ได้ว่าคุณต้องทำงานเองเกือบทุกอย่างตั้งแต่ติดต่อลูกค้า จัดทำเอกสาร ทำบัญชี ไม่มีหยุดเสาร์อาทิตย์ (ในช่วงแรก) ให้ได้ คุณทำได้ไหม
ถ้าทำไม่ได้ก็แนะนำให้ไปเลือกทางเลือกอื่นครับ

มาเรื่องจริงบ้าง

เนื่องจากบริษัทที่ผมทำงานอยู่ใช้ภาษาในการพัฒนามากเช่น PHP, java, Javascript, C# ซึ่งจริงๆที่มันเยอะอาจมาจาก ลูกค้าหน้า… ที่มีความต้องการแบบต่างๆเช่น ผมอยู่บนโลก Windows คุณต้องเขียน C# หรือบางที่บอก เราไม่ให้ใช้ Java เพราะมันไม่ปลอดภัย (เอ้า ไอเชี่ยไม่ปลอดภัยยังไงวะ) หรือ มาจากปัญหาในการข้อจำกัดในการพัฒนาในช่วงนั้น

ในตอนก่อนๆผมเล่าเรื่องการทำ Repository ไว้เก็บ Lib กลางให้บริษัทใช้ซึ่งตอนก่อนๆผมทำ npm ให้ภาษา javascript ซึ่งตอนนี้มีคนมาใช้ได้แล้ว (คนเดียว) ต่อไปก็ถึงคิว Java กันแล้ว โดย Java ตัวนี้จะใช้เป็น Maven repository มาเริ่มกันเลยดีกว่า(ชักแม่น้ำมาเยอะละ)

ลงมือกันเลย

ส่วนของผู้ที่จะเอา Lib ของ Java ขึ้น Maven

ถ้าคุณมี Project ที่เขียนด้วย Java และใช้ Maven อยู่แล้วนี่ง่ายมากครับที่จะเอา lib ขึ้น Maven repo ขั้นแรกให้เพิ่ม Tag เหล่านี้ไปใน pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<!-- Tag อื่นๆ เช่น dependency อยู่ด้านบน -->

<!-- เพิ่มอันนี้เข้าไปใน pom.xml -->
<distributionManagement>
<repository>
<id>nexus-release</id>
<name>nexus-release</name>
<url>http://192.168.56.101:8081/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>

</project>

ที่เพิ่มเข้าไปนี้คือการบอกว่า เราจะ deploy code ของเราไปที่ไหนบ้าง โดยอันนี้ผมจะให้มัน deploy ไปไว้ที่ http://192.168.56.101:8081/nexus/repository/maven-releases/ (อันนี้เป็น repository เครื่องจำลองของผมเอง) โดย url นี้ไปเอามาได้จากตรงนี้เลย

จากนั้นต้องไป setting ไฟล์ของ maven ที่ลงที่เครื่องกันครับโดย Folder ของมันชื่อ .m2 แต่ละ os จะมีที่วางไม่เหมือนกัน

1
2
3
4
5
6
7
8
9
10

Windows
C:\Documents and Settings\{your-username}\.m2
หรือ
C:\Users\{your-username}\.m2

Mac and Linux
~/.m2

~ หมายถึง Home ของ User ที่เข้าใช้งานครับ

โดยไปที่ Folder : .m2 แล้วไปที่ไฟล์ settings.xml โดยหากไม่มีให้ไปเอาตัวอย่างได้จาก ตัวอย่างไฟล์ settings.xml

จากนั้นทำการเพิ่ม tag server ภายใน servers

1
2
3
4
5
6
7
<servers>
<server>
<id>nexus-release</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>

โดยตรง id นั้นจะต้องตรงกันกับใน pom.xml ที่เรากำหนดไป สังเกตว่า id ของทั้งสองอันคือ nexus-release เหมือนกันครับ ส่วน username password ก็ username password ของ nexus ที่ตั้งไว้ อันนี้เป็น admin admin123 ครับ (จริงๆมันคือค่า Default)

จากนั้นลองทำการสั่ง mvn deploy ที่ Folder project หรือถ้าใช้ ide ก็สั่งให้มัน run ผ่าน ide หากไม่มีอะไรผิดพลาดตัว project จะโผล่ใน maven repo ใน nexus ตามภาพ

สำหรับคนที่จะเอา Lib จาก repo ลงมาใช้งาน

อันนี้เราต้องทำการเพิ่มข้อมูลที่ไฟล์ pom.xml ของ Project ที่ผมใช้ทำ Lib ไว้ Deploy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<!-- มี Tag อื่นๆ อยู่ด้านบน -->

<dependencies>
<dependency>
<groupId>test.maven</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>

<!-- Tag อื่นๆ เช่น dependency อยู่ด้านบน -->
<repositories>
<repository>
<id>nexus-release</id>
<url>http://192.168.56.101:8081/nexus/repository/maven-public/</url>
</repository>
</repositories>
</project>

โดยส่วนนี้คือการทำการเพิ่ม repository ที่เราจะเอา Lib มาใช้ โดยหากท่านไม่เคยไปทำการเพิ่มค่า server ที่ไฟล์ settings.xml แล้วล่ะก็ให้ไปทำการเพิ่มด้วยนะครับ โดยทำแบบหัวข้อด้านบนเลย ส่วน url ที่ใส่มานั้นหาได้จาก maven-public โดยตัว maven-public ตัวนี้คือช่องทางให้เราเข้าไปโหลด lib ลงมานั่นเอง

จากนั้นเราก็แค่ไป copy ตัว dependency tag มาใส่ เท่านั้นก็สามารถนำ Lib มาใช้งานได้แล้วครับ สำหรับตอนนี้ขอจบเพียงเท่านี้ เจอกันใหม่ตอนหน้า กะจะทำส่วนที่เป็น Docker แต่ไม่รู้จะทำได้หรือเปล่า

ตัวอย่าง pom.xml ที่ใช้ Deploy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test.maven</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>helloworld</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.10</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>10</source>
<release>10</release>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2</version>
<!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>nexus-release</id>
<name>nexus-release</name>
<url>http://192.168.56.101:8081/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
</project>

สำหรับใครไม่รู้จะเลือกภาษาอะไรมาเขียนโปรแกรม ผมแนะนำอันนี้เลย

ref :
http://www.baeldung.com/maven-deploy-nexus
https://gist.github.com/ozkansari/5882919
https://github.com/sonatype/nexus-book-examples/blob/master/maven/apache-maven/conf/settings.xml
http://www.tcdc.or.th/creativethailand/magazine/28436
http://www.tcdc.or.th/upload/iblock/1ff/1ff1be239418097ab4841770df53e085.pdf
https://codeburst.io/what-programming-language-should-i-learn-f3f164ca376c

เพลงประกอบการเขียนบทความนี้ :