gradle 프로젝트 에서 자원 파일 의 상대 적 인 경로 포장 기술 을 볼 수 있 습 니 다.
그러나 어느 날 설정 을 수정 해 야 합 니 다.예 를 들 어 하나의 응용 프로그램 이 출시 되 었 을 때 디 버 깅 편 의 를 위해 log 의 로그 단 계 를 낮 출 수 있 습 니 다.예 를 들 어 INFO 단 계 는 일정 시간 안정 적 으로 실행 한 후에 WARN 이나 ERROR 등급 의 로 그 를 기록 해 야 합 니 다.이 럴 때 log4j 2.xml 와 같은 설정 파일 을 수정 해 야 합 니 다.설정 파일 을 jar 파일 내부 에 포장 하면 변경 하기 가 귀 찮 습 니 다.재 포장 배 치 를 하거나 온라인 상에 서 jar 명령 으로 jar 가방 을 압축 을 풀 고 고 친 후에 포장 하 는 것 이 번 거 롭 습 니 다.
이러한 수요 에 직면 하여 더 좋 은 방법 은 jar 파일 의 외부 상대 디 렉 터 리 에 프로필 을 두 는 것 입 니 다.프로그램 이 시 작 될 때 상대 디 렉 터 리 에 있 는 프로필 을 불 러 오 는 것 입 니 다.이렇게 바 꾸 면 훨씬 편리 합 니 다.다음은 어떻게 실현 하 는 지 보 여 줍 니 다.(gradle 프로젝트 를 예 로 들 면)
주로 다음 과 같은 몇 가지 와 관련된다.
1.설정 파일 을 jar 파일 에 포장 하지 않 는 방법
설정 파일 을 외부 디 렉 터 리 에 두 었 으 니 jar 파일 내부 에 이 파일 들 을 중복 포함 할 필요 가 없습니다.build.gradle 파일 을 수정 할 수 있 습 니 다.아래 를 참고 하 십시오.
processResources {
exclude { "**/*.*" }
}
기본 프로 세 스 리 소스 task 를 덮어 쓰 는 것 과 같 습 니 다.이렇게 gradle 을 포장 할 때 자원 디 렉 터 리 에 있 는 모든 파일 이 제 외 됩 니 다.2.log4j 2 의 설정 로드 처리
log4j 2 설정 파일 을 불 러 올 때 기본적으로 classpath 의 log4j 2.xml 파일 을 찾 습 니 다.설정 파일 의 위 치 를 수 동 으로 지정 하지 않 고 원본 코드 를 분석 합 니 다.
다음 단락 을 찾 을 수 있 습 니 다:
org.apache.logging.log4j.core.config.ConfigurationFactory.Factory#getConfiguration(java.lang.String, java.net.URI)
public Configuration getConfiguration(final String name, final URI configLocation) {
if (configLocation == null) {
final String configLocationStr = this.substitutor.replace(PropertiesUtil.getProperties()
.getStringProperty(CONFIGURATION_FILE_PROPERTY));
if (configLocationStr != null) {
ConfigurationSource source = null;
try {
source = getInputFromUri(NetUtils.toURI(configLocationStr));
} catch (final Exception ex) {
// Ignore the error and try as a String.
LOGGER.catching(Level.DEBUG, ex);
}
if (source == null) {
final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();
source = getInputFromString(configLocationStr, loader);
}
if (source != null) {
for (final ConfigurationFactory factory : getFactories()) {
final String[] types = factory.getSupportedTypes();
if (types != null) {
for (final String type : types) {
if (type.equals("*") || configLocationStr.endsWith(type)) {
final Configuration config = factory.getConfiguration(source);
if (config != null) {
return config;
}
}
}
}
}
}
} else {
for (final ConfigurationFactory factory : getFactories()) {
final String[] types = factory.getSupportedTypes();
if (types != null) {
for (final String type : types) {
if (type.equals("*")) {
final Configuration config = factory.getConfiguration(name, configLocation);
if (config != null) {
return config;
}
}
}
}
}
}
} else {
// configLocation != null
final String configLocationStr = configLocation.toString();
for (final ConfigurationFactory factory : getFactories()) {
final String[] types = factory.getSupportedTypes();
if (types != null) {
for (final String type : types) {
if (type.equals("*") || configLocationStr.endsWith(type)) {
final Configuration config = factory.getConfiguration(name, configLocation);
if (config != null) {
return config;
}
}
}
}
}
}
Configuration config = getConfiguration(true, name);
if (config == null) {
config = getConfiguration(true, null);
if (config == null) {
config = getConfiguration(false, name);
if (config == null) {
config = getConfiguration(false, null);
}
}
}
if (config != null) {
return config;
}
LOGGER.error("No log4j2 configuration file found. Using default configuration: logging only errors to the console.");
return new DefaultConfiguration();
}
그 중 상수 CONFIGURATIONFILE_PROPERTY 의 정의:public static final String CONFIGURATION_FILE_PROPERTY = "log4j.configurationFile";
이 코드 를 통 해 알 수 있 듯 이 로그 4j 2 의 getLogger 를 처음 호출 하기 전에 시스템 속성 을 설정 하고 설정 파일 이 있 는 위치 로 가리 키 면 됩 니 다.
3.다른 설정 파일(예 를 들 어 spring 설정)의 상대 경로 로 불 러 오기
이것 은 비교적 쉽 습 니 다.spring 자체 가 파일 디 렉 터 리 에서 설정 을 불 러 오 는 능력 을 지원 합 니 다.
이상 의 분석 을 종합 하면 도구 류 를 포장 할 수 있 습 니 다.
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import java.io.File;
public class ApplicationContextUtil {
private static ConfigurableApplicationContext context = null;
private static ApplicationContextUtil instance = null;
public static ApplicationContextUtil getInstance() {
if (instance == null) {
synchronized (ApplicationContextUtil.class) {
if (instance == null) {
instance = new ApplicationContextUtil();
}
}
}
return instance;
}
public ConfigurableApplicationContext getContext() {
return context;
}
private ApplicationContextUtil() {
}
static {
// log4j2.xml
String configLocation = "resources/log4j2.xml";
File configFile = new File(configLocation);
if (!configFile.exists()) {
System.err.println("log4j2 config file:" + configFile.getAbsolutePath() + " not exist");
System.exit(0);
}
System.out.println("log4j2 config file:" + configFile.getAbsolutePath());
try {
// : LoggerFactory.getLogger(XXX.class)
System.setProperty("log4j.configurationFile", configFile.getAbsolutePath());
} catch (Exception e) {
System.err.println("log4j2 initialize error:" + e.getLocalizedMessage());
System.exit(0);
}
// spring
configLocation = "resources/spring-context.xml";
configFile = new File(configLocation);
if (!configFile.exists()) {
System.err.println("spring config file:" + configFile.getAbsolutePath() + " not exist");
System.exit(0);
}
System.out.println("spring config file:" + configFile.getAbsolutePath());
if (context == null) {
context = new FileSystemXmlApplicationContext(configLocation);
System.out.println("spring load success!");
}
}
}
주:설정 파일 을 상대 디 렉 터 리 resources 에 두 기로 약 속 했 습 니 다.또한 log4j 2 의 설정 파일 이름 은 log4j 2.xml 이 고,spring 의 입구 설정 파일 은 spring-context.xml 입 니 다.(이 약속 을 따 르 지 않 으 려 면 이 코드 를 참고 하여 스스로 수정 하 십시오)이 도구 클래스 가 있 으 면 mainclass 입구 프로그램 에서 이렇게 사용 할 수 있 습 니 다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
/**
* Created by yangjunming on 12/15/15.
* author: [email protected]
*/
public class App {
private static ApplicationContext context;
private static Logger logger;
public static void main(String[] args) {
context = ApplicationContextUtil.getInstance().getContext();
logger = LoggerFactory.getLogger(App.class);
System.out.println("start ...");
logger.debug("debug message");
logger.info("info message");
logger.warn("warn message");
logger.error("error message");
System.out.println(context.getBean(SampleObject.class));
}
}
다시 한 번 우정 알림:logger 의 실례 화 는 응용 프로그램 ContextUtil.getInstance().getContext()에 두 어야 합 니 다.이후,그렇지 않 으 면 logger 는 첫 번 째 초기 화 때 classpath 에서 log4j 2.xml 파일 을 찾 으 려 고 시도 합 니 다.예화 한 후에 시스템 속성 을 설정 하면 소 용이 없습니다.4.gradle 포장 처리
코드 를 다 썼 고 마지막 작업 을 하지 않 았 습 니 다.설정 파일 을 jar 에 포장 하지 않 으 면 jar 패키지 의 상대 디 렉 터 리 resources 에 복사 해 야 합 니 다.build.gradle 스 크 립 트 를 수정 하여 컴퓨터 로 처리 하고 수 동 으로 설정 파일 을 복사 할 수 있 습 니 다.
task pack(type: Copy, dependsOn: [clean, installDist]) {
sourceSets.main.resources.srcDirs.each {
from it
into "$buildDir/install/$rootProject.name/bin/resources"
}
}
이 task 를 추가 하면 gradle pack 으로 직접 포장 을 실현 할 수 있 고 설정 파일 을 상대 디 렉 터 리 resources 디 렉 터 리 에 자동 으로 복사 할 수 있 습 니 다.다음 그림 을 참고 하 십시오.마지막 으로 국제 관례 는 예시 적 인 소스 코드 를 준다https://github.com/yjmyzz/config-load-demo
gradle pack 후 build/install/config-load-demo/bin 디 렉 터 리 에 들 어가 서 실행 할 수 있 습 니 다./config-load-demo(windows 에서 config-load-demo.bat 를 실행)효 과 를 보고 resources/log4j 2.xml 의 로그 단 계 를 수정 하여 다시 실행 하고 변 화 를 관찰 하려 고 합 니 다.
이상 의 gradle 프로젝트 에서 자원 파일 의 상대 적 인 경로 포장 기술 은 반드시 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Groupie의 ViewHolder를 사용해 보았습니다.Groupie는 Android의 recycler-view를 쉽게 사용할 수있는 라이브러리이지만 groupie-databinding은 deprecated되었습니다. 이번에는 권장되는 (Poi) groupie-viewb...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.