>  기사  >  Java  >  SpringBoot에서 Jar 파일을 배포하는 방법

SpringBoot에서 Jar 파일을 배포하는 방법

WBOY
WBOY앞으로
2023-05-24 13:15:23722검색

기본 구성:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

구성 출력:

cd package-optimize-level0
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel    16M Feb 24 21:06 package-optimize-app1/target/package-optimize-app1.jar

java -jar package-optimize-app1/target/package-optimize-app1.jar

주요 사항:

  • (현재 데모 애플리케이션은 spring-boot-starter-web에 매우 적은 구성 요소에만 의존하며 모든 빌드 출력은 약 12MB에 불과함) 실제 상황에서 단일 빌드의 출력 jar은 프로젝트 종속 구성 요소의 양에 따라 달라지며 일반적으로 수십 MB에서 100MB, 200MB 또는 그 이상까지 다양합니다.

  • 12개의 마이크로서비스를 배포해야 하는 경우 몇 GB의 파일을 전송해야 하므로 많은 시간이 소요됩니다. 개별 마이크로서비스에 대한 단일 업데이트에도 1~200MB의 전송이 필요합니다.

레벨 1: 일반적인 종속성 jar 분리 구성 방법

참조 프로젝트 디렉터리: package-optimize-level1

문제 해결 해제:

  • 배포를 용이하게 하기 위해 단일 마이크로서비스 jar의 파일 크기 줄이기 파일 전송 프로세스는 몇 초 정도 걸립니다. 기본 구성:

주요 구성 지침의 경우 자세한 내용은 다음 참고 사항을 참조하세요.

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>true</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

구성 출력:

cd package-optimize-level1
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel   149K Feb 24 20:56 package-optimize-app1/target/package-optimize-app1.jar

java -jar -Djava.ext.dirs=lib package-optimize-app1/target/package-optimize-app1.jar

성취 효과:

  • 단일 빌드는 일반적으로 jar 기반 출력만 수행합니다. 프로젝트 종속 구성 요소의 양에 따라 100KB 또는 200KB의 경우 기본적으로 몇 초 안에 전송할 수 있습니다.

  • 이것은 인터넷에서 볼 수 있는 가장 일반적인 최적화 솔루션이며 추가로 살펴볼 가치가 있습니다. 12개의 마이크로서비스가 있고 각 서비스에 jar 및 lib 디렉터리 파일이 있는 경우 첫 번째 배포에서는 다음을 거의 전송해야 합니다. 1GB 또는 2GB 파일.

레벨 2: 모든 모듈 종속 jar를 동일한 lib 디렉터리에 병합

참조 프로젝트 디렉터리: package-optimize-level2

문제 해결:

  • 모든 모듈 종속 jar를 동일하게 병합 lib 디렉터리, 일반적으로 각 모듈 프로젝트는 높은 수준의 jar 중첩에 의존하기 때문에 결합된 모든 서비스 배포 파일의 총 크기는 기본적으로 2~300MB

  • 입니다. 그러나 -Djava.ext.dirs=lib가 다음과 같은 경우입니다. 모든 jar를 각 JVM에 로드하는 데 사용됩니다. 첫째, 각 JVM은 모든 jar를 완전히 로드하고 리소스를 소비합니다. 둘째, 각 마이크로서비스 구성 요소의 서로 다른 버전으로 인해 버전 충돌이 발생합니다.

주요 구성 지침은 다음과 같습니다. 자세한 내용은 다음 참고 사항을 참조하세요.

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                        详见各子模块中 boot-jar-output 属性定义
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                详见各子模块中boot-jar-output属性定义
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
각 마이크로서비스에서 구축한 모든 lib 디렉터리 파일과 jar는 devops 공용 디렉터리에 집계됩니다.

마이크로 서비스 jar 파일의 META-INFO/MANIFEST 파일은 모듈 종속 구성 요소 목록을 기반으로 Class-Path 속성을 생성하므로 다양한 jar 버전을 방지할 수 있습니다.

Class-Path: lib/spring-boot-starter-web-2.4.3.jar lib/spring-boot-starte
 r-2.4.3.jar lib/spring-boot-2.4.3.jar lib/spring-boot-autoconfigure-2.4
 .3.jar lib/spring-boot-starter-logging-2.4.3.jar lib/logback-classic-1.
 2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/log4j-t
 o-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib/jul-to-slf4j-1.7.30.jar
  lib/jakarta.annotation-api-1.3.5.jar lib/spring-core-5.3.4.jar lib/spr
 ing-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/spring-boot-starter-json-2
 .4.3.jar lib/jackson-databind-2.11.4.jar lib/jackson-annotations-2.11.4
 .jar lib/jackson-core-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar l
 ib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-name
 s-2.11.4.jar lib/spring-boot-starter-tomcat-2.4.3.jar lib/tomcat-embed-
 core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/tomcat-embed-websocket-9.0
 .43.jar lib/spring-web-5.3.4.jar lib/spring-beans-5.3.4.jar lib/spring-
 webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/spring-context-5.3.4.jar 
 lib/spring-expression-5.3.4.jar

구성 출력:

cd package-optimize-level2
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  34 lixia  wheel   1.1K Feb 24 22:27 lib
-rw-r--r--   1 lixia  wheel   150K Feb 24 22:31 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar

성취 효과 :

시작 프로세스에는 더 이상 -Djava.ext.dirs=lib 매개변수 정의가 필요하지 않습니다.

  • 모든 마이크로서비스 jar는 모든 프로젝트 병합 종속 구성 요소의 공통 디렉터리를 참조합니다. 배포 파일의 총 크기는 일반적으로 2~300MB입니다.

  • 각 마이크로 서비스 jar 파일의 META-INFO/MANIFEST 파일에서 클래스 경로를 사용자 정의하여 종속 버전 구성 요소 클래스를 명확하게 표시함으로써 각 마이크로 서비스의 서로 다른 구성 요소 버전 충돌 문제를 해결할 수 있습니다.

  • 레벨 3: 시스템에 의해 도입된 비공식 타사 종속 구성 요소 지원

참조 프로젝트 디렉터리: package-optimize-level3

문제 해결:

다음과 같은 일부 비공식 타사 구성 요소 sdk jar의 한 가지 방법은 참조용으로 Maven 로컬 프라이빗 서버에 제출하는 것입니다. 이는 일반 종속 jar 처리와 동일하지만 Maven 프라이빗 서버가 없는 경우 일반적으로 단순화된 접근 방식은 종속 jar를 직접 배치하는 것입니다. 프로젝트를 선택한 다음 pom 방식 정의에서 시스템 범위를 사용합니다.

  • systemPath를 통해 pom에 도입된 maven-jar-plugin 구성 요소의 경우 maven-jar-plugin 구성 요소에는 지정된 범위를 포함하는 구성 요소를 선언하는 직접적인 매개 변수가 없습니다. 정의된 구성 요소는 META-INFO/MANIFEST에 나타나지 않으므로 런타임 클래스를 찾을 수 없습니다.

  • 기본 구성:

키 구성 지침은 다음 참고 사항을 참조하세요.

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                    <manifestEntries>
                        <!--
                        有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
                        通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可
                        例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
                        详见各子模块中 boot-jar-output 属性定义示例
                        -->
                        <Class-Path>${jar-manifestEntries-classpath}</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                        详见各子模块中 boot-jar-output 属性定义
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                详见各子模块中boot-jar-output属性定义
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
하위 모듈의 기본 구성:

    <properties>
        <!-- 按各模块实际目录层次定义相对数据,使所有服务模块输出资源汇聚到相同目录 -->
        <boot-jar-output>../devops</boot-jar-output>
        <!--
        有些供应商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
        通过使用额外定义 Class-Path 值来追加指定依赖组件列表,按实际情况指定 jar-manifestEntries-classpath 值即可
        例如(注意前面个点字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是实际文件名):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
        -->
        <jar-manifestEntries-classpath>. lib/hik-sdk-1.0.0.jar</jar-manifestEntries-classpath>
    </properties>
    <dependencies>
        <!-- 以相对路径方式定义非官方三方依赖组件 -->
        <dependency>
            <groupId>com.hik</groupId>
            <artifactId>hik-sdk</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

마이크로서비스 출력 jar 파일의 META-INFO/MANIFEST 파일은 다음을 생성합니다. 모듈에 따른 모듈 종속 구성 요소 목록의 Class-Path 속성의 경우 jar-manifestEntries-classpath 속성 정의 값이 앞에 추가됩니다:

Class-Path: . lib/hik-sdk-1.0.0.jar lib/spring-boot-starter-web-2.4.3.ja
 r lib/spring-boot-starter-2.4.3.jar lib/spring-boot-2.4.3.jar lib/sprin
 g-boot-autoconfigure-2.4.3.jar lib/spring-boot-starter-logging-2.4.3.ja
 r lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-ap
 i-1.7.30.jar lib/log4j-to-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib
 /jul-to-slf4j-1.7.30.jar lib/jakarta.annotation-api-1.3.5.jar lib/sprin
 g-core-5.3.4.jar lib/spring-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/sp
 ring-boot-starter-json-2.4.3.jar lib/jackson-databind-2.11.4.jar lib/ja
 ckson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-da
 tatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jacks
 on-module-parameter-names-2.11.4.jar lib/spring-boot-starter-tomcat-2.4
 .3.jar lib/tomcat-embed-core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/to
 mcat-embed-websocket-9.0.43.jar lib/spring-web-5.3.4.jar lib/spring-bea
 ns-5.3.4.jar lib/spring-webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/s
 pring-context-5.3.4.jar lib/spring-expression-5.3.4.jar

구성 출력:

cd package-optimize-level3
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  36 lixia  wheel   1.1K Feb 24 23:14 lib
-rw-r--r--@  1 lixia  wheel   150K Feb 24 23:14 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar

최종 구현 효과

모든 서비스의 종속 구성 요소가 하나로 병합됩니다. 디렉터리의 전체 크기는 2~300MB이며 첫 번째 배포의 전송 효율성이 크게 가속화됩니다.

  • 각 마이크로서비스 jar의 크기는 1~200KB입니다. 일일 긴급 버그 수정과 개별 jar 업데이트는 기본적으로 즉각적입니다.

  • 각 마이크로서비스 jar는 지정된 버전에 따라 달라지는 구성 요소 목록을 정의하므로 서로 다른 버전의 구성 요소 간에 로드 충돌이 발생하지 않습니다.

  • 비공식 타사 종속 구성 요소도 정상적으로 참조하고 처리할 수 있습니다.

위 내용은 SpringBoot에서 Jar 파일을 배포하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제