gradle 프로젝트 에서 자원 파일 의 상대 적 인 경로 포장 기술 을 볼 수 있 습 니 다.

자바 애플 리 케 이 션 을 개발 할 때 ant/maven/gradle 의 어떤 방식 으로 구축 되 든 마지막 에 실행 가능 한 jar 패키지 프로그램 으로 포장 되 고 프로그램 실행 에 필요 한 자원 파일(프로필),예 를 들 어 jdbc.properties,log4j 2.xml,spring-xxx.xml 등 은 jar 에 함께 포장 할 수 있 습 니 다.프로그램 이 실 행 될 때 classpath*:xxx.xml 와 같은 것 으로 불 러 올 수 있 습 니 다.대부분의 경우 이렇게 하면 일 을 잘 할 수 있다.
그러나 어느 날 설정 을 수정 해 야 합 니 다.예 를 들 어 하나의 응용 프로그램 이 출시 되 었 을 때 디 버 깅 편 의 를 위해 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 프로젝트 에서 자원 파일 의 상대 적 인 경로 포장 기술 은 반드시 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기