복붙노트

[SPRING] Classpath를 가진 Spring Boot 실행 가능한 Jar

SPRING

Classpath를 가진 Spring Boot 실행 가능한 Jar

Spring Boot를 사용하여 엔터프라이즈 소프트웨어 시스템과 상호 작용하는 소프트웨어 시스템을 구축 중입니다. 내 시스템은 해당 엔터프라이즈 시스템의 일부 jar 및 * .ini 파일에 의존하므로 Maven의 모든 종속성을 압축 할 수 없습니다. 임베디드 Tomcat으로 실행 가능한 Jar로 Spring Boot를 실행할 수 있기를 원합니다. 또한 커맨드 라인을 통해 클래스 패스를 설정할 수 있기를 바랍니다. 이렇게 무언가 같이 :

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

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

그래서 Tomcat이 내장 된 Spring 실행 가능한 jar로 작업하기 위해 -classpath를 만들 수있는 방법이 있습니까?

모든 도움을 미리 감사드립니다.

해결법

  1. ==============================

    1.외부 라이브러리를 추가하려면 loader.path 특성을 사용할 수 있습니다.

    외부 라이브러리를 추가하려면 loader.path 특성을 사용할 수 있습니다.

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

    최신 정보

    클래스 패스에서 추가 파일을 읽어야하는 경우 응용 프로그램의 매니페스트 파일을 작성 / 변경해야합니다.

    de.app.Application 클래스에서 스프링 부트 컨텍스트를 초기화한다고 가정합니다. MANIFEST.MF는 다음과 같이 표시되어야합니다.

    Manifest-Version: 1.0
    Main-Class: de.app.Application
    Class-Path: /home/sleeper/thirdparty/lib/
    

    그리고 당신은 java -jar MyApp.jar로 앱을 시작할 수 있습니다.

    MANIFEST.MF에 대한 자세한 내용은 Manifest 파일 작업 : 기본 사항을 참조하십시오.

  2. ==============================

    2.외부 폴더에서 * .ini 파일을로드해야한다고 언급했습니다. 나는 비슷한 것을해야했고, 외부 폴더에서 CSV 파일을로드해야했습니다.

    외부 폴더에서 * .ini 파일을로드해야한다고 언급했습니다. 나는 비슷한 것을해야했고, 외부 폴더에서 CSV 파일을로드해야했습니다.

    내 파일 구조는 다음과 같습니다.

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

    ResouceLoader를 사용하여 파일을로드하는 중 :

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

    스크립트 시작 :

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

    리소스가 "config"폴더에서 예상대로로드되지 않았습니다. 몇 가지 연구를 한 후 ZIP 레이아웃을 사용하기 위해 Maven 플러그인 구성을 변경해야한다는 것을 알게되었습니다.

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

    이것은 스프링 부트가 PropertiesLauncher를 사용하도록 지시 할 것이고, 이것은 "loader.path"로부터 외부 자원을 로딩 할 수있게 해준다.

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

  3. ==============================

    3.Linux :

    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
    

    이렇게하면 다른 답변과 마찬가지로 매니페스트 나 스프링 부트 메이븐 플러그인 구성이 엉망이되는 것을 피할 수 있습니다. loader.main에 기본 클래스를 지정할 수있는 PropertiesLauncher로 앱을 시작합니다. 앞에서 언급했듯이, Loader.path와 함께 PropertiesLauncher를 사용하면 어떤 이유로 리소스 파일을 클래스 경로에 추가하지 않습니다. 이 문제는 -jar 대신 -cp를 사용하여 해결됩니다.

    편집하다 주석에서 피아노 사우루스 (Pianosaurus)에 언급 된 바와 같이, ";"대신 ":"을 사용하십시오. Linux의 클래스 경로에 구분 기호로 사용

  4. from https://stackoverflow.com/questions/39716796/spring-boot-executable-jar-with-classpath by cc-by-sa and MIT license