programing

클래스 경로가 있는 스프링 부트 실행 파일 병

telecom 2023. 6. 19. 21:08
반응형

클래스 경로가 있는 스프링 부트 실행 파일 병

저는 Spring Boot을 사용하여 기업용 소프트웨어 시스템과 상호 작용할 수 있는 소프트웨어 시스템을 구축하고 있습니다.내 시스템은 해당 엔터프라이즈 시스템의 일부 jars 및 *.ini 파일에 의존하므로 메이븐의 모든 종속성을 패킹할 수 없습니다.저는 Tomcat이 내장된 실행 가능한 Jar로 Spring Boot을 실행할 수 있으면 좋겠습니다.또한 명령줄을 통해 클래스 경로를 설정할 수 있으면 좋겠습니다.그래서 다음과 같은 것이 있습니다.

java -classpath /home/sleeper/thirdparty/lib -jar MyApp.jar

그러나 -classpath와 -jar는 공존할 수 없습니다."-Dloader.path"를 사용해 보았습니다.폴더 아래에 있는 모든 jar 파일을 로드할 수 있었지만 폴더의 *.ini 파일과 같은 다른 파일은 로드할 수 없었습니다.

그래서 우리가 Tomcat이 내장된 Spring 실행 가능한 병으로 작업할 수 있는 클래스 경로를 만들 수 있는 방법이 있습니까?

Linux의 경우:

java -cp MyApp.jar:/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher

Windows의 경우:

java -cp MyApp.jar;/home/sleeper/thirdparty/lib -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher

이렇게 하면 다른 답변에서와 같이 매니페스트 또는 Spring Boot Maven 플러그인 구성이 엉망이 되는 것을 방지할 수 있습니다.속성이 포함된 앱이 실행됩니다.Launcher: loader.main에서 주 클래스를 지정할 수 있습니다.앞서 언급했듯이, 어떤 이유로 속성을 사용하는 경우loader.path가 있는 시작 프로그램은 리소스 파일을 클래스 경로에 추가하지 않습니다.이 문제는 -jar 대신 -cp를 사용하여 해결할 수 있습니다.

편집 댓글에서 Pianosaurus가 언급했듯이 Linux의 클래스 경로에서 구분자로 ";" 대신 ":"를 사용합니다.

외부 라이브러리만 추가하려면 다음을 사용할 수 있습니다.loader.path소유물.

java -Dloader.path="your-lib/" -jar your-app.jar

갱신하다

클래스 경로에서 추가 파일도 읽어야 하는 경우 응용 프로그램의 매니페스트 파일을 만들거나 변경해야 합니다.

클래스에서 Spring Boot 컨텍스트를 초기화하고 있다고 가정합니다.de.app.Application.당신의.MANIFEST.MF다음과 같이 표시됩니다.

Manifest-Version: 1.0
Main-Class: de.app.Application
Class-Path: your-lib/

그리고 당신은 간단히 당신의 앱을 시작할 수 있습니다.java -Dloader.path="your-lib/" -jar MyApp.jar.

매니페스트.MF에 대한 자세한 내용은 매니페스트 파일 작업을 참조하십시오. 기본 사항.

외부 폴더에서 *.ini 파일을 로드해야 한다고 언급했습니다.외부 폴더에서 CSV 파일을 로드하는 비슷한 작업을 수행해야 했습니다.

내 파일 구조는 이렇게 생겼습니다.

./myapp.jar  
./config/file.csv

ResourceLoader를 사용하여 다음과 같이 파일을 로드했습니다.

Resource res = resourceLoader.getResource("classpath:file.csv");
File csvFile = res.getFile();

시작 스크립트:

java -Dloader.path="config" -jar your-app.jar

리소스가 "config" 폴더에서 로드되지 않았습니다.몇 가지 조사 결과 ZIP 레이아웃을 사용하려면 메이븐 플러그인 구성을 변경해야 한다는 것을 알게 되었습니다.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>ZIP</layout>
    </configuration>
</plugin>

그러면 스프링 부트에서 속성을 사용하도록 지시됩니다.시작 프로그램: "loader.path"에서 외부 리소스를 로드할 수 있습니다.

자세한 내용은 이 우수한 기사를 참조하십시오.

  java -cp  C:\jar-path\your-jar-1.2.0.jar -Dloader.main=package-and-main class  -Dloader.path=external dependency jar path  org.springframework.boot.loader.PropertiesLauncher -Dspring.profiles.active=profile etc -default,test --spring.config.location=external properties file name

외부 메모리를 정의하려면

        java -ms8g -mx8g -cp

java -cp

-Dloader.main

SpringBoot의 org.springframework.boot.loader.특성.Launcher에는 loader.main이라는 논리적 메인 클래스를 재정의할 수 있는 JVM 인수가 함께 제공됩니다.

-로더.경로.

속성 알려주기"lib"에 있는 라이브러리를 선택해야 하는 시작 프로그램

org.springframework.boot.sys.특성.런처

SpringBoot의 org.springframework.boot.loader.특성.Launcher에는 loader.main이라는 논리적 메인 클래스를 재정의할 수 있는 JVM 인수가 함께 제공됩니다.

          java -cp bootApp.jar -Dloader.main=org.khan.DemoApplication  org.springframework.boot.loader.PropertiesLauncher

-Dspring.profiles.active

스프링 프로필을 사용하는 경우 먼저 프로필을 설정해야 합니다.

     set SPRING_PROFILES_ACTIVE=default,test

또는 window run type envi and add

      spring_profiles_active
       default,test

--spring.config.location

디렉토리가 지정되면 application.properties가 검색됩니다.

속성이 없는 단순 솔루션을 추가하는 것뿐입니다.시작 프로그램 또는 인수가 너무 많습니다.

1 - 표준 실행 파일 스프링 부트 병(my-spring-boot-app.jar)을 빌드합니다.

2 - 그런 다음 -jar 옵션을 사용하지 않고 JarLauncher 클래스를 메인 클래스로 사용하여 실행합니다.

java -cp "/path/to/jars/*:/path/to/app/my-spring-boot-app.jar" org.springframework.boot.loader.JarLauncher

(임의의 경로도 완벽하게 유효함)

그것뿐

을 Spring Boot에 배치하는 입니다.BOOT-INF/lib이렇게 하면 종속성이 있는 복사본이 생성됩니다.jar또는war이 생성되고 이 " " 입니다.classpath.idx또한 업데이트되었습니다.

공식 문서는 여기에서 확인할 수 있습니다.

정확도 문헌에는 다음과 같은 내용이 나와 있습니다.

응용 프로그램 클래스는 중첩된 BOOT-INF/classes 디렉토리에 배치해야 합니다.종속성은 중첩된 BOOT-INF/lib 디렉토리에 배치해야 합니다.

나는 이미 외부 Jar 파일로 그것을 하고 모든 것이 정상입니다.

제게 효과가 있었던 한 가지 해결책은 외부 클래스가 있는 병을 삽입하는 것이었습니다.MANIFEST.MFClass-Path그 이유는-jar는 합니다.-classpathCLASSPATH환경 변수입니다.
절차:

  1. 합니다.maven-jar-pluginPOM 으로안;
  2. 행 추가:
    <configuration>
        <archive>
            <manifestEntries>
                <Class-Path>/my/external/jar/absolute/path.jar</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>

실행방으로 및 java -jar myapp.jar매니페스트에는 다음 행이 포함됩니다.

Class-Path: /my/external/jar/absolute/path.jar

컴파일할 수 (는 가게하파컴면외아검색니됩다부않음에타지이임렇런되복사일이닌이간파시일가파▁this▁in▁bet(색않▁will'음it됩검니다▁copied▁jar▁external▁at▁way▁the▁and-▁be▁won지▁searched되사일이이▁runtime복▁at)BOOT_INF/lib).

출처:

포스트 1

포스트 2

언급URL : https://stackoverflow.com/questions/39716796/spring-boot-executable-jar-with-classpath

반응형