스프링 부트:fat jar를 사용하여 임의의 디렉토리에서 외부 application.properties 파일을 사용할 수 있습니까?
application.properties 파일을 여러 개 가질 수 있습니까? (편집: 이 질문은 제목에 있는 질문으로 발전되었습니다.)
2개의 파일을 가지려고 했어요.
- 첫 번째는 응용 프로그램 Jar의 루트 폴더에 있습니다.
- 두 번째는 classpath에 지정된 디렉토리에 있습니다.
두 파일 모두 'application.properties'라는 이름이 붙습니다.
두 파일 모두 내용을 병합할 수 있습니까?(두 번째 파일의 속성 값이 첫 번째 파일의 속성 값보다 우선됩니다) 또는 한 개의 파일이 있으면 다른 파일은 무시됩니다.
업데이트 1: 콘텐츠를 병합할 수 있습니다.어제는 첫 번째 것이 무시된 것 같았는데, 그때 뭔가 고장이 났기 때문인 것 같아요.이제 잘 작동한다.
업데이트 2: 다시 돌아왔습니다!두 파일 중 하나만 적용됩니다.이상하다...Spring Tool Suite를 사용하여 앱 jar 파일을 작성한 후 시작되었습니다.또한 Jar 버전은 항상 (클래스 패스에 있는)두 번째 버전을 무시하고 STS에서 실행되는 확장 버전의 동작은 다른 것 같습니다.어디서부터 조사를 시작할 수 있나요?
업데이트 3:
Jar 버전의 동작은 사실 정확했습니다.java.exe 사양입니다.-jar 옵션을 지정하면 java.exe는 -classpath 옵션과 CLASSPATH 환경변수를 모두 무시하고 classpath에는 jar 파일만 포함됩니다.따라서 클래스 경로의 두 번째 application.properties 파일은 무시됩니다.
이제 클래스 경로의 두 번째 application.properties를 로드하려면 어떻게 해야 합니까?
업데이트 4:
-jar 옵션을 사용하여 application.properties 파일을 외부 경로에 로드했습니다.
키는 Properties였습니다.런처
속성을 사용하려면런처 pom.xml 파일은 다음과 같이 변경해야 합니다.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <!-- added -->
<layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
</configuration>
</plugin>
</plugins>
</build>
이에 대해 StackOverflow 질문을 참조했습니다.스프링 부트 속성 런처는 사용할 수 없습니다.BTW, In Spring Boot Maven Plugin 문서(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html),에서는 ZIP을 지정하면 속성이 트리거된다는 설명은 없습니다.런처가 사용되고 있습니다.(다른 문서일 수도 있습니다)
jar 파일이 작성된 후 Properties가런처는 META-INF/MENIFEST에서 Main-Class 속성을 검사하여 사용합니다.MF가 병 안에 있어요
이제 다음과 같이 jar를 실행할 수 있습니다(Windows).
java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar
응용 프로그램 jar 파일은 loader.path에 포함되어 있습니다.
C: 에 application.properties 파일이 있습니다.\My\External\Dir\config가 로드됩니다.
또한 이 디렉토리의 모든 파일(예: 정적 html 파일)은 로더 경로에 있으므로 jar에서 액세스할 수 있습니다.
UPDATE 2에 기재되어 있는 non-jar(확장) 버전에 대해서는 classpath 오더에 문제가 있을 수 있습니다.
(그런데, 이 문제에 대해 좀 더 구체적으로 설명하기 위해 질문 제목을 변경했습니다.)
Boot (Spring Boot 사용 을하지 않은 .@EnableAutoConfiguration
★★★★★★★★★★★★★★★★★」@SpringBootApplication
속성 소스 처리를 변경하지 않은 경우 다음 순서로 속성을 검색합니다(가장 높은 값이 가장 낮은 값보다 우선합니다).
- A
/config
- 현재 디렉토리
- 클래스 패스
/config
「」 - 클래스 패스 루트
위의 목록은 문서의 이 부분에 기재되어 있습니다.
, 예: ,, 를, 떤, 떤 등)를 합니다.application.properties
아래src/resources
는, 「」에 있는 됩니다.application.properties
/config
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Spring Boot에서 사용되는 이 디폴트 순서를 사용하면 구성을 매우 쉽게 외부화할 수 있으며, 여러 환경(개발, 스테이징, 운영, 클라우드 등)에서 애플리케이션을 쉽게 구성할 수 있습니다.
에 의해 을 속성으로 표시하려면( Boot에서 수 있는 보다 훨씬 더(hint: spring boot에서 읽을 수 있습니다).application.properties
)는 문서의 이 부분을 참조하십시오.
위의 간단한 설명이나 전체 문서에서 알 수 있듯이 Spring Boot 앱은 DevOps에 매우 적합합니다.
이 모든 것에 대해서는, 다음의 문서에 설명되어 있습니다.
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
그 때문에, 다음의 우선순위가 설명되고 있습니다.
- 현재 디렉토리의 /config 서브dir.
- 현재 디렉토리
- classpath /config 패키지
- 클래스 패스 루트
또한 다음과 같은 오버라이드에 대한 추가 속성 파일을 정의할 수도 있습니다.
java -jar myproject.jar
--spring.config.location=classpath:/overrides.properties
사용하시는 경우spring.config.location
의 디폴트 로케이션application.properties
또한 포함되어 있습니다.즉, 디폴트값을 설정할 수 있습니다.application.properties
특정 환경에 필요한 경우 덮어씁니다.
-jar 옵션을 사용하여 application.properties 파일을 외부 경로에 로드했습니다.
키는 Properties였습니다.런처
속성을 사용하려면런처 pom.xml 파일은 다음과 같이 변경해야 합니다.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <!-- added -->
<layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
</configuration>
</plugin>
</plugins>
</build>
이에 대해 StackOverflow 질문을 참조했습니다.스프링 부트 속성 런처는 사용할 수 없습니다.BTW, In Spring Boot Maven Plugin 문서(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html),에서는 ZIP을 지정하면 속성이 트리거된다는 설명은 없습니다.런처가 사용되고 있습니다.(다른 문서일 수도 있습니다)
jar 파일이 작성된 후 Properties가런처는 META-INF/MENIFEST에서 Main-Class 속성을 검사하여 사용합니다.MF가 병 안에 있어요
이제 다음과 같이 jar를 실행할 수 있습니다(Windows).
java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar
응용 프로그램 jar 파일은 loader.path에 포함되어 있습니다.
C: 에 application.properties 파일이 있습니다.\My\External\Dir\config가 로드됩니다.
또한 이 디렉토리의 모든 파일(예: 정적 html 파일)은 로더 경로에 있으므로 jar에서 액세스할 수 있습니다.
UPDATE 2에 기재되어 있는 non-jar(확장) 버전에 대해서는 classpath 오더에 문제가 있을 수 있습니다.
다음과 같이 외부 속성 파일 경로를 사용하여 스프링 부트 응용 프로그램을 시작할 수 있습니다.
java -jar {jar-file-name}.jar
--spring.config.location=file:///C:/{file-path}/{file-name}.properties
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
</configuration>
</plugin>
</plugins>
</build>
java -Dloader.path=file:///absolute_path/external.jar -jar example.jar
java -jar server-0.0.1-SNAPSHOT.jar --spring.config.location=application-prod.properties
나는 이것이 날카로운 질문이라는 것을 알고 있으며, op에서는 다른 속성 파일을 로드하기를 원했다.
제 대답은 이런 맞춤 해킹을 하는 것은 끔찍한 아이디어라는 것입니다.
클라우드 파운드리와 같은 클라우드 공급자와 함께 스프링 부트를 사용하는 경우 클라우드 구성 서비스를 사용하십시오.
https://spring.io/projects/spring-cloud-config
default/dev/project-default/project-dev 고유의 속성을 로드 및 Marge합니다.
다시 말씀드리지만, Spring Boot에서는 이미 이 기능을 제대로 수행할 수 있는 충분한 방법을 제공하고 있습니다.https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
바퀴를 다시 발명하지 마십시오.
이것은 늦어질 수 있지만, 특히 스프링 부트 앱을 실행할 때 외부 구성을 로드하는 더 나은 방법을 찾은 것 같습니다.java jar myapp.war
@PropertySource("classpath:some.properties") " "
설정은 프로젝트의 루트 또는 war/jar 파일이 실행되고 있는 위치에서 로드됩니다.
public class Application implements EnvironmentAware {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
public void setEnvironment(Environment environment) {
//Set up Relative path of Configuration directory/folder, should be at the root of the project or the same folder where the jar/war is placed or being run from
String configFolder = "config";
//All static property file names here
List<String> propertyFiles = Arrays.asList("application.properties","server.properties");
//This is also useful for appending the profile names
Arrays.asList(environment.getActiveProfiles()).stream().forEach(environmentName -> propertyFiles.add(String.format("application-%s.properties", environmentName)));
for (String configFileName : propertyFiles) {
File configFile = new File(configFolder, configFileName);
LOGGER.info("\n\n\n\n");
LOGGER.info(String.format("looking for configuration %s from %s", configFileName, configFolder));
FileSystemResource springResource = new FileSystemResource(configFile);
LOGGER.log(Level.INFO, "Config file : {0}", (configFile.exists() ? "FOund" : "Not Found"));
if (configFile.exists()) {
try {
LOGGER.info(String.format("Loading configuration file %s", configFileName));
PropertiesFactoryBean pfb = new PropertiesFactoryBean();
pfb.setFileEncoding("UTF-8");
pfb.setLocation(springResource);
pfb.afterPropertiesSet();
Properties properties = pfb.getObject();
PropertiesPropertySource externalConfig = new PropertiesPropertySource("externalConfig", properties);
((ConfigurableEnvironment) environment).getPropertySources().addFirst(externalConfig);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
} else {
LOGGER.info(String.format("Cannot find Configuration file %s... \n\n\n\n", configFileName));
}
}
}
}
도움이 됐으면 좋겠다.
fat jar(-cp fat.jar) 또는 모든 jar(-cp "$JARS_DIR/*")를 포함하는 클래스 경로와 보통 다른 곳 및 외부 jar를 포함하는 다른 커스텀 구성 클래스 경로 또는 폴더를 사용하는 유연한 방법입니다.따라서 제한된 java -jar 대신 다음과 같이 보다 유연한 클래스 경로 방식을 사용합니다.
java \
-cp fat_app.jar \
-Dloader.path=<path_to_your_additional_jars or config folder> \
org.springframework.boot.loader.PropertiesLauncher
스프링 부트 실행 jar 문서 및 이 링크를 참조하십시오.
MainApp이 여러 개 있는 경우 실행 가능한 jar에 사용할 메인 클래스를 Spring Boot에 알려 주는 방법을 사용할 수 있습니다.
loader.properties에 환경 변수 LOADER_PATH 또는 loader.path(아카이브 내의 디렉토리, 아카이브 또는 디렉토리의 콤마 구분 목록)를 설정하여 위치를 추가할 수 있습니다.기본적으로 loader.path는 java -jar 또는 java -cp 방식으로 동작합니다.
application.yml은 항상 덮어쓰고 정확하게 지정할 수 있습니다.디버깅을 위해 픽업해야 합니다.
--spring.config.location=/some-location/application.yml --debug
yml 파일용 솔루션:
1. yml을 jar 어플리케이션과 같은 디렉토리에 복사한다.
를 실행합니다.예: 2. 실행 명령어, 실행 예xxx.yml
:
java -jar app.jar --spring.config.location=xxx.yml
정상적으로 동작하지만 스타트업 로거에 INFO가 표시됩니다.
No active profile set .........
maven install을 사용하여 spring boot jar를 만들고 properties file이나 lib folder 등의 모든 리소스를 jar 외부에 작성하는 경우...그런 다음 pom.xml 안에 다음 코드를 추가합니다.여기서 원하는 jar 리소스를 추출하고 저장할 출력 폴더를 정의합니다.
<build>
<finalName>project_name_Build/project_name</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/project_name_Build/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>write here the qualified or complete path of main class of application</mainClass>
</manifest>
<manifestEntries>
<Class-Path>. resources/</Class-Path>
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
<include>log4j.properties</include>
</includes>
<targetPath>${project.build.directory}/ConsentGatewayOfflineBuild/resources</targetPath>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
<include>log4j.properties</include>
</includes>
</resource>
</resources>
<pluginManagement>
<plugins>
<!-- Ignore/Execute plugin execution -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<!-- copy-dependency plugin -->
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
외부화할 속성을 file.properties 또는 yml에 넣습니다.
@Bean
//Reads database properties from the config.yml
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new FileSystemResource(filePath + File.separator +"config.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
propertySourcesPlaceholderConfigurer.setIgnoreResourceNotFound(true);
return propertySourcesPlaceholderConfigurer;
}
언급URL : https://stackoverflow.com/questions/26140784/spring-boot-is-it-possible-to-use-external-application-properties-files-in-arbi
'programing' 카테고리의 다른 글
HTML을 렌더링하지 않고 React를 사용할 수 있습니까? (0) | 2023.03.07 |
---|---|
material-ui 1.0 목록에 링크를 추가하는 방법 (0) | 2023.03.07 |
Redux와 Redux-Toolkit 중 어느 쪽을 사용해야 합니까? (0) | 2023.03.07 |
Null 값으로 열 업데이트 (0) | 2023.03.07 |
http 페이지에서 https 사용 Ajax (0) | 2023.03.07 |