spring boot 프로젝트 fat jar 다이어트 실현

프로젝트 배경
spring cloud 는 spring boot 프로젝트 를 구축 하고 각 프로젝트 의 차원 을 세분 화하 여 결합 도 를 낮 추 는 목적 을 달성 하 며 프로젝트 간 에 restful 통신 을 바탕 으로 합 니 다.
프로젝트 를 포장 하 는 과정 에서 spring-boot-maven-plugin 플러그 인 을 사용 하여 포장 합 니 다.fat jar 가 생 성 되 었 습 니 다.이 jar 가방 을 압축 해제 하면 프로젝트 가 의존 하 는 jar 가방 이 BOOT-INF 에 저 장 된 lib 폴 더 에 저 장 된 것 을 발견 할 수 있 습 니 다.여러 개의 키 항목 을 분석 한 결과 같은 jar 가방 이 절대 다 수 를 차지 한 다음 에 온라인 환경 에 배치 할 때마다 각 시스템 의 공동 jar 는 서버 에 중복 방치 되 어 있 습 니 다.따라서 자 연 스 럽 게 공 통 된 jar 가방 이나 자주 바 뀌 지 않 는 jar 가방 을 빼 내 고 단독 한 부 를 정리 한 다음 각 하위 프로젝트 가 시 작 될 때 외부 로 불 러 와 fat jar 다이어트 의 목적 을 달성 할 수 있 는 방법 이 있 을 지 생각 합 니 다.
2.fat jar 다이어트
상기 분석 을 통 해 관련 자 료 를 조회 하고 다음 절 차 를 정리 하여 jar 가방 다이 어 트 를 진행 합 니 다.
1.항목 별로 spring-boot-maven-plugin 플러그 인공식 문서을 설정 하여 fat jar 에 남아 있 는 jar 패 키 지 를 생 성 합 니 다.

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <layout>ZIP</layout>
          <!-- <excludeGroupIds>
            org.springframework.boot,
            org.springframework.cloud,
            org.mybatis.spring.boot,
            tk.mybatis,
            mysql,
            com.alibaba,
            javax.persistence,
            io.springfox,
            org.springframework.session
          </excludeGroupIds> -->
          <includes>
            <include>
              <groupId>xx</groupId>
              <artifactId>xx</artifactId>
            </include>
            <include>
              <groupId>xx</groupId>
              <artifactId>xx</artifactId>
            </include>
          </includes>
        </configuration>
      </plugin>
상기 코드 와 같이 excludeGroupIds 나 includes,또는 다른 탭 을 사용 하여 상황 을 구체 적 으로 볼 수 있 습 니 다.
2.프로젝트 의존 jar 에서 fat jar 에 저장 하고 싶 지 않 은 jar 가방 을 추출 합 니 다.
방법 1(추천):프로젝트 pom 파일 에 maven 의존 플러그 인 추가공식 문서

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.1.1</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <!-- <outputDirectory>E:/lib</outputDirectory> -->
              <excludeGroupIds>
                <!--    fat jar  jar  groupId   (  ,  )-->
              </excludeGroupIds>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
라벨 의 구체 적 인 의 미 는 공식 문 서 를 보십시오.
maven 을 사용 하여 프로젝트 를 포장 할 때 maven 명령 을 사용 합 니 다:
화면 음악 n clean install-DMaven.test.skip=true-Output Directory=E:/lib(-Output Directory=E:/lib 는 명령 동적 지정 항목 에 의존 하 는 jar 패키지 내 보 내기 경로 입 니 다.항목 에 outputDirectory 의 태그 값 을 지정 하면 이 동적 경 로 를 덮어 씁 니 다)
플러그 인 을 설정 하여 이 명령 을 실행 하면 프로젝트 에서 excludeGroupIds 탭 에 설 정 된 jar 패 키 지 를 제외 하고 나머지 는 지정 한 디 렉 터 리 에 가 져 옵 니 다.이로써 fat jar 에 남아 있 는 jar 패 키 지 를 추출 할 수 있 습 니 다.
방법 2:프로젝트 에 maven 의존 플러그 인 을 추가 하지 않 고 프로젝트 에 뮤 직 비디오 를 사용 하여 jar 패키지 에 의존 하 는 명령 을 직접 복사 합 니 다.이 방식 은 각각 키 항목 에 의존 하여 복사 해 야 합 니 다.하위 항목 은 적 게 사용 할 수 있 습 니 다.
화면 음악 n dependency:copy-dependencies-Output Directory=E:/lib(동적 지정 디 렉 터 리 가 없 으 면 기본적으로 프로젝트 의 target 경로 에서 dependency 디 렉 터 리 를 생 성 합 니 다)
각 항목 을 내 보 내 는 의존 jar 가방 을 하나의 폴 더 에 통일 적 으로 넣 고 중복 을 제거 하 며 fat jar 에 남 겨 진 의존 jar 가방 을 삭제 합 니 다.이로써 fat jar 에 남 은 jar 가방 을 제거 합 니 다.
3.추출 한 jar 패 키 지 를 서버 의 특정한 경로 에 두 고 프로젝트 시작 스 크 립 트 를 설정 하여 외부 로 불 러 옵 니 다.
nohup java -Dloader.path="xx/lib" -jar xx.jar
-loader.path 는 외부 로 딩 주소 입 니 다.
이로써 살 이 빠 졌 습 니 다.프로젝트 를 포장 한 jar 가방 에서 볼 수 있 습 니 다.BOOT-INF 의 lib 에는 필요 한 jar 가방 만 있어 fat jar 의 크기 를 크게 줄 였 습 니 다.
pom 의 설정 은 마이크로 서비스 시스템 에 사용 되 며,통 일 된 설정 을 형성 할 수 있 으 며,각 항목 의 jar 패키지 의존 관 계 는 구체 적 인 상황 에 따라 변 경 됩 니 다.
3.직면 한 문제 와 해결 방법
살 을 빼 는 과정 에서 순탄 하지 않 았 습 니 다.큰 성 과 를 거 두 었 다 고 생각 했 을 때 프로젝트 를 시작 하 는 데 실 패 했 고 jar 충돌 을 발 견 했 습 니 다.
1.jar 가방 충돌 을 해결 하고 mvn 명령 을 통 해 jar 가방 의 의존 관 계 를 분석 하 며 충돌 jar 가방 을 찾 아 버 전 을 통일 합 니 다.
eclipse 에서 새로운 Maven Build 를 만 들 었 습 니 다.처음에 저 는 mvn dependency:tree 를 시 도 했 습 니 다.전체적으로 jar 가방 의존 도 를 분 석 했 지만 문제 jar 가방 의 의존 관 계 를 찾 지 못 했 습 니 다.이 어 저 는 mvn dependency:tree-Dverbose 를 시 도 했 습 니 다.모든 간접 적 인 의존 도 문제 jar 가방 의 의존 관 계 를 분석 하지 못 했 습 니 다.
이로써,나 는 프로젝트 에 이 jar 가방 이 없다 고 의심 했다.반복 적 으로 포장 한 후에,나 는 이 문제 의 jar 가방 이 확실히 프로젝트 의존 에 있 고,단지 너무 깊이 숨 어 있 는 것 을 보 았 다.따라서 하나의 jar 가방 만 분석 할 수 있 습 니 다.
화면 음악 dependency:tree-Dverbose-Dincludes=xx:xx:xx(xx:xx:xx 대응 jar 패키지 의 groupId:artifactId:version)
Dincludes 를 사용 한 후 jar 가방 에 대한 의존 관 계 를 찾 았 고 프로젝트 에서 이 jar 가방 을 제외 하고 다시 포장 한 후 프로젝트 가 시작 되 어 문제 가 해결 되 었 습 니 다.
2.포장 과정 에서 일부 세분 화 된 하위 항목 은 spring-boot-maven-plugin 플러그 인 을 사용 하지 않 고 maven-jar-plugin 을 사용 하여 실행 가능 한 jar 로 직접 포장 한 다음 에 fat jar 다이어트 설정 을 결합 한 결과 서로 통 하 는 jar 에 의존 할 수 있 었 는데 지금 은 효력 을 잃 었 습 니 다.fat jar 다이어트 후의 lib 에 서 는 코드 가 자주 바 뀌 는 프로젝트 의 jar 만 남 았 기 때문에 의존 관 계 는 실행 가능 한 jar 에서 전달 되 지 않 았 기 때문에 이 프로젝트 에서 필요 한 프로젝트 의 jar 가방 에 외 현적 으로 의존 해 야 프로젝트 의 완전 성 을 확보 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기