0

fat-jar를 제공하는 springboot 프로젝트를 만들었습니다. 런타임에 외부 xml 파일을 it.i로 밀어 넣고 싶습니다. xml 파일을 spring-boot-tomcat 컨테이너에 넣으려고합니다. (@ import, --spring.config.location, 등) 그 방법은 나를 위해 밖으로 작동하지 않았다 그것을 할 여러 가지 방법을 시도했다.외부 xml 파일을 spring boot embedded Tomcat continor에 푸시하는 방법

xml 파일은 응용 프로그램에서 Azure 포털로 원격 측정을 게시하는 데 사용되는 ApplicationInsight.xml입니다.

도움을 주시면 감사하겠습니다.

+0

를 어떻게 배포 및 실행됩니다

java -jar build/libs/file-gateway.jar -Dapplicationinsights.configurationDirectory=/apps/conf/ 

당신이 가진 자원 기반을 설정할 수 있습니다 귀하의 응용 프로그램 (OS, 클라우드 플랫폼 등)은 무엇입니까? – Pytry

+0

다음은 전체 문제 description.https : //github.com/Microsoft/ApplicationInsights-Java/issues/472 – Muni

답변

0

GitHJub 문제를 기반으로 문제의 일부는 JVM 매개 변수를 전달하는 방법과 "spring.config.location"을 사용하는 방법입니다.

저는 Azure Insights에 익숙하지 않지만 올바르게 이해하면 ApplicationInsights.xml 파일을로드하려고 시도하고 자동으로 구성됩니다. 그래서 이전에 이미 초기화되었으므로 이전에 제안한대로 WebConfigurerAdapter에서 설정할 수 없습니다. 맞습니까? 어쨌든 그 부분을 남겨 뒀지 만 빨리로드해야하므로 클래스 패스에 파일을 최대한 빨리 추가하는 몇 가지 추가 방법을 제공했습니다.

새로운 재료가

먼저 원래 GitHub의 람 게시 한이 줄을보고 받아 "파일의"클래스 경로 "하지 않고,

java -jar build/libs/file-gateway.jar --spring.config.location=classpath:/apps/conf/ApplicationInsight.xml 

대신 값이해야 그냥 폴더 경로를 "접두사. 또한 '-'대신 '-D'를 사용해보십시오.

java -jar build/libs/file-gateway.jar -Dspring.config.location=/apps/conf/ 

속성은 스프링 부트의 자동 구성 속성 파일이있는 디렉토리를 참조해야합니다. 또한 특정 "application.properties | yml"파일을 참조하기 위해 작동 할 수도 있습니다.

그걸로 제 이전 제안이 효과가있을 것 같습니다. 올드 제안

당신이 자원을로드하기위한 독특한 방법이 필요한 경우

, 당신은 응용 프로그램에 자원 핸들러를 추가 할 수 있습니다.

@Configuration 
@EnableWebMvc 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Value("${telemetry.folder}") 
    private String telemetryFolder; 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry 
      .addResourceLocations(telemetryFolder); 
    } 
} 

그리고/또는 당신은 아파치 IO와 함께로드 할 수 : 당신이 사용하는 API는 훨씬 이전에 초기화 할 필요가없는 경우

@Value("${telemetry.file}") 
private String telemetryFile; 

@Autowired 
private ResourceLoader resourceLoader; 

public String telemtryXml(){ 

    return org.apache.commons.io.IOUtils.toString(resourceLoader.getResource(telemtryFile).getInputStream()); 
} 

그러나 이것은에만 작동합니다. GitHub의 문제에 대한 당신의 마지막 게시물에서

더 새로운 물건

, 당신이 시도 :

java -jar build/libs/file-gateway.jar -Dapplicationinsights.configurationDirectory=/apps/conf/ 
대신

java -jar build/libs/file-gateway.jar -applicationinsights.configurationDirectory="/apps/conf/" 

를,이 같은 JVM 매개 변수로 속성을 추가하려고

뒤에 대문자 'D'문자를 추가했음을 주목하십시오. 경로에서 따옴표를 제거했습니다.

다른 방법으로 클래스 경로에 파일을 추가 할 수 있습니다.

  1. 디렉토리를 JVM 클래스 경로에 추가하십시오.

    자바 -cp "빌드/libs와/파일 gateway.jar :/응용 프로그램/conf의/*"your.package.MainSpringBootApplication

이것은 당신이 (보통)는 메인 클래스를 지정해야합니다 '@SpringBootApplication'으로 주석을 달고 main 메소드를 포함하고있다. 이전과 같이 jar를 실행하지는 않지만 여전히 classpath에 추가합니다.

  1. SpringBoot를 잊어 버리고 JEE 개발자로서 귀하의 뿌리로 돌아가십시오. "src/main/resources/META-INF"폴더 나 "src/main/webapp/META-INF"폴더 아래에 앱용 "context.xml"을 추가하십시오. 나는 실행 가능한 war 파일을 만드는 중이며 jar 파일을 만드는 것을 선호한다.

예제의 context.xml :

<?xml version='1.0' encoding='utf-8'?> 
<!-- path should be the context-path of you application. 
<Context path="/"> 
    <Resources className="org.apache.catalina.webresources.StandardRoot"> 
    <PreResources base="/apps/conf" 
        className="org.apache.catalina.webresources.DirResourceSet" 
        internalPath="/" 
        webAppMount="/WEB-INF/classes"/> 
    </Resources> 
</Context> 

는 또한 EL과 JVM 매개 변수를 사용할 수 있습니다.

그래서 당신이 함께 항아리를 실행하면 :

<!--snip --> 
<PreResources base="${applicationinsights.configurationDirectory}" 
<!--snip --> 

희망하는 데 도움이 :

+0

위의 해결 방법을 시도했지만 스프링 자원이 해당 xml 파일을 직접 읽지 만 제대로 작동하지 않았습니다. 임베디드 - 바람둥이 콘테이너에 – Muni

+0

아 ... 알았어. 좀 더 유용하게 내 대답을 업데이트하겠습니다. – Pytry

+0

자세한 설명을 해주셔서 감사합니다. 나는 위의 모든 제안, 새로운 것들 및 더 새로운 것들을 시도했다. 아무것도 나를 위해 일한, 또한 conf 디렉토리를 읽을 classpath에 context.xml을 가지고 가려고했습니다. 그 사람들도 봄 자원이 바람둥이 컨테이너가 아닌 그 파일을 읽는다. 외부에서 시작하는 동안 xml 파일을 임베디드 tomcat에 직접 푸시하는 방법을 알려주시겠습니까? 또는 끼워 넣어 진 바람둥이가 그것의 lib 위치의 밑에 외부 conf 파일을 가지고 갈 그런 방법으로 gradle 파일을 놓으십시오. 임베디드 - 바람둥이 lib 폴더에 파일을 배치해야합니다 – Muni