Custom Self-Hosted Maven Repository

Giới thiệu Đối với một số ứng dụng sử dụng nhiều Micro Service bên trong, những Class, Function,… có thể dụng lại cho tất cả service khác thì việc copy past rất là bất tiện và khó khăn. Có rất nhiều cách để triển khai thành một thư viện cho chính chúng ta, nhưng hầu

Giới thiệu

Đối với một số ứng dụng sử dụng nhiều Micro Service bên trong, những Class, Function,… có thể dụng lại cho tất cả service khác thì việc copy past rất là bất tiện và khó khăn.

Có rất nhiều cách để triển khai thành một thư viện cho chính chúng ta, nhưng hầu hết sẽ được public trên Maven Central.

Nên hôm nay mình sẽ trình bày cách làm thế nào để tạo ra thư viện của riêng chúng ta và sử dụng một cách riêng tư (private) đối với một số công ty hoặc project không muốn public ra bên ngoài

Mình sẽ sử dụng open source là Reposilite.
Reposilite là một kho quản trí lưu trữ nhẹ dành cho các Maven artifact.

Ở bài viết này mình sẽ trình bày từng bước cài đặt và triển khai artifact một cách cụ thể.

Let go~.

Cài Đặt

Tải file .jar của Reposilite tại Github

Ở đây mình sẽ tải xuống bản mới nhất là Reposilite 3.0.0-alpha.23
Lưu ý: Hãy đặt file .jar vào thư mục rỗng vì khi run sẽ tự sinh ra một số file khác.

Mở terminal và cd vào đường dẫn mà bạn lưu trữ file .jar và chạy dòng lệnh:

$ java -Xmx32M -jar reposilite-3.0.0-alpha.23-all.jar

Sau khi khởi tạo:

Terminal sẽ cung cấp giao diện CLI để người dùng tương tác.

Ứng dụng sẽ chạy mặc định trên localhost với port 80 (http://localhost:80)

Screen Shot 2022-03-21 at 13.29.22.png

Authorization

Để sử dụng thì trước hết chúng ta phải tạo một access token.

Có rất nhiều cách phân quyền và quản lí trên Reposilite, tham khảo tại Authorization
Còn ở đây mình sẽ tạo một user với một quyền cao nhất là admin.

Để tạo chạy câu lệnh dưới dây trên giao diện CLI:

token-generate [--secret=<secret>] <name> [<permissions>]

E.g:

token-generate admin m

m được đánh dấu user đó như là một quản trị viên, sẽ có tất cả quyền hạn như truy cấp vào tất cả các path trong kho lưu trữ của Reposilite và cho phép truy cập CLI từ xa thông qua dashboard.

Screen Shot 2022-03-21 at 13.51.03.png
Reposilite sẽ tạo cho chúng ta một access token.

Quay trở lại giao diện ứng dụng của Reposilite(http://localhost:80) và Sign in bằng name và access token mà bạn vừa tạo ra, bạn sẽ thấy index release lúc này đang rỗng.

Screen Shot 2022-03-21 at 13.55.07.png

Deployment

Ở đây mình sẽ tạo một project bằng framework Quarkus của Java.

Screen Shot 2022-03-21 at 14.08.55.png
Mình sẽ viết một Class đơn giản như cộng trừ nhân chia chẳng hạn 😄

package org.reposilite;

public class Operation {

    public Integer plus(int number1,int number2) {
        return number1 + number2;
    }

    public Integer minus(int number1,int number2) {
        return number1 - number2;
    }

    public Integer divide(int number1,int number2) {
        if(number2 == 0)
            return null;

        return number1 / number2;
    }

    public Integer multiply(int number1,int number2) {
        return number1 * number2;
    }
}

Ví dụ như Class này sẽ có nhiều service sử dụng lại, thay vì phải copy paste thì bây giờ mình sẽ triển khai nó như một thư viện để sử dụng cho tất cả các project sau này nhưng không public ra bên ngoài 😉

Deploy bằng cách sử dụng mvn deploy

Trong project của bạn tại file pom.xml thêm vào :

<project>
...
  <distributionManagement>
    <repository>
      <id>my-repository</id>
      <url>http://localhost:80/releases</url>
    </repository>
  </distributionManagement>
...
</project>

id là id repository mà bạn muốn đặt tên.

url là đường dẫn đến repository server.

Trong file ~/m2/settings.xml trên máy của bạn thêm vào:

<server>
  <!-- id phải trùng khớp với id được định nghĩa ở file pom.xml trong project-->
  <id>my-repository</id>
  <username>{alias}</username>
  <password>{token}</password>
</server>

aliastoken bạn đã tạo ra ở bước Authorization, vậy ta có:

<server>
  <!-- id phải trùng khớp với id được định nghĩa ở file pom.xml trong project của bạn-->
  <id>my-repository</id>
  <username>admin</username>
  <password>IEnfkPeMfUjU0dlt2eMPFEBvw0Hm16nCPdB0FbvHMOFBAIk3c4AIA00Lir7g01Hk</password>
</server>

Screen Shot 2022-03-21 at 14.49.35.png

Chạy câu lệnh để triển khai project của bạn lên Reposilite:

mvn deploy

Screen Shot 2022-03-21 at 14.46.07.png

Vậy là hoàn tất quá trình deploy, ta quay lại giao diện Reposilite kiểm tra:

Screen Shot 2022-03-21 at 14.47.22.png

Vậy là lên rồi 😄

Cách sử dụng

Bây giờ mình sẽ tạo project khác và sử dụng thư viện mà ta vừa deploy 😛
Hai thư viện mình sử dụng thêm ở đây là:

  • RESTEasy Jackson
  • SmallRye OpenAPI

Screen Shot 2022-03-21 at 15.00.25.png

Ở giao diện Reposilite ta copy dependency vào file pom.xml của project mới vừa tạo.

Screen Shot 2022-03-21 at 15.08.39.png

<dependencies>
    <dependency>
      <groupId>org.reposilite</groupId>
      <artifactId>my-practice-repo</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>

Và:

<repositories>
<!--Your custom maven repo-->
    <repository>
        <id>my-repository</id>
        <name>My custom maven repo</name>
        <url>http://localhost:80</url>
    </repository>
</repositories>

Chạy câu lệnh để cài đặt các thư viện trong file pom.xml

mvn clean install

Sau đó thử gõ Class Operation xem gợi ý không:

Screen Shot 2022-03-21 at 15.22.25.png
Vậy là có rồi 😄

Tiếp theo mình sẽ khởi tạo một api đơn giản tại src/main/java/me/repo/practice/MyPracticeResource

package me.repo.practice;

import org.reposilite.Operation;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/operator")
public class MyPracticeResource {

    Operation operator = new Operation();

    @POST
    @Path("plus")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Integer plus(@QueryParam("a") int numberA,@QueryParam("b") int numberB) {
        return operator.plus(numberA,numberB);
    }

    @GET
    @Path("minus")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Integer minus(@QueryParam("a") int numberA,@QueryParam("b") int numberB) {
        return operator.minus(numberA,numberB);
    }
}

Chạy câu lệnh để khởi động project:

mvn quarkus:dev

Gọi thử API minus và xem kết quả nhé :

curl -X 'GET' 'http://localhost:8080/operator/minus?a=10&b=2' -H 'accept: application/json'

Screen Shot 2022-03-21 at 15.35.10.png

Và ta có kết quả là 8

References

https://kihats.medium.com/custom-self-hosted-maven-repository-cbb778031f68
https://reposilite.com

Do là lần đầu viết bài và mới tiếp cận Java được 4-5 tuần nên có gì sai sót gì về tên gọi hay sai ở đâu mọi người góp ý giúp mình cải thiện nhé 😄
Chúc mọi người nhiều sức khoẻ ❤️

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,