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

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ