2009-10-28 4 views
2

내 애플리케이션은 데이터를 저장할 수있는 디렉토리의 경로를 알아야한다. Java 시스템 속성을 설정하고 그 변수를 Spring XML의 자리 표시 자로 사용하려고했습니다.Maven을 사용하는 Spring XML에서 시스템 속성을 확인할 수 없다.

Eclipse에서이 속성을 실행 구성 환경에 추가 했으므로 잘 작동합니다. Spring은 $ {dataDir}을 올바른 경로로 해결합니다.

그러나 Maven2 (mvn test -DdataDir = c :/data)를 사용하여 응용 프로그램을 테스트 할 때 Spring은 자리 표시자를 확인할 수 없다고 불평합니다.

내 봄 XML은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 

xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<!-- Allows me to use system properties in this file --> 
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 

<bean id="xmlConfiguration" class="org.apache.commons.configuration.XMLConfiguration"> 
    <constructor-arg index="0"> 
    <value>${dataDir}/conf/config.xml</value> 
    </constructor-arg> 
</bean> 
</beans> 

은 왜 시스템 속성은 봄에 전달되지 않는 이유는 무엇입니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떤 제안을 주셔서 감사합니다!

편집 : 물론, 당신 말이 맞아요. $ {baseDir}은 $ {dataDir} 여야합니다. 하지만 그것은 실제 코드가 아니라이 질문의 오타였습니다.

+1

은 baseDir이 아니면 dataDir이 아니야 – toolkit

+0

툴킷, 네, 그렇게 생각합니다. –

답변

4

이것은 Surefire 플러그인 2.4.3의 알려진 버그입니다. 자세한 내용은 JIRA 문제 "System properties set on the command line get clobbered"을 참조하십시오. 이전 버전, 2.4.2 대신 사용

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <!-- Use 2.4.2 because 2.4.3 has bug with system properties 
      see http://jira.codehaus.org/browse/SUREFIRE-121 --> 
     <version>2.4.2</version> 
    </plugin> 
    </plugins> 
</build> 
1

는 아마도 MVN 시험이 시험을 실행하는 시스템의 특성을 통과하지 않습니다 중 하나 ...하지만 그것은 작동하지 않습니다하기 전에

나는 MAVEN_OPTS에게를 시도? 테스트 플러그인을 사용하여 속성을 전달할 수 있습니까? (자체적으로 시스템 속성에서 가져올 수 있음)?

은 참조 : 당신이 mvn 스크립트를 보면 http://maven.apache.org/maven-1.x/plugins/test/properties.html

+0

이것은 POM 파일에 필요한 모든 속성을 포함시키는 최상의 솔루션입니다. 이 방법으로 프로젝트와 함께 저장되므로 모든 팀 구성원이 액세스 할 수 있으므로 별도로 env를 설정할 필요가 없으므로 버전 제어가 가능합니다. –

0

, 당신은하지 JVM 인수로, 명령 줄을 통해 전달되는 모든 인수가 출시 클래스에 인수로 전달되는 것을 볼 수 있습니다. 그래서 -D가 작동하지 않습니다.

가장 빠른 해결 방법은 MAVEN_OPTS 환경 변수를 정의하는 것입니다 (예 :

set MAVEN_OPTS="-DdataDir=c:/data" 

다음 mvn test

+0

나는 이것이 더 이상 사실이라고 생각합니다. 선택된 답변에 링크 된 JIRA 문제의 최근 추가 사항은 "MAVEN_OPTS를 통해 JVM으로 직접 전달 된 시스템 소품은 테스트로 전달되지 않습니다"라고 말합니다. – Patrick

0

당신이 동일한 변수 이름을 사용해야 할 수 있습니다 실행? dataDir을 전달했지만 baseDir을 기대합니다. 내가 잘못?

0

을 그 flicken의 answer이 질문에 대한 정답이라고 생각합니다.

그러나 config.xml 파일을 src/test/resources으로 옮기는 것이 좋습니다. 이것은 완벽한 위치 (Maven의 세계에서) 인 것처럼 보입니다.이 방법으로 클래스 패스에서 파일을 사용할 수 있습니다 (절대 경로를 사용할 필요가 없습니다). 그 위에, 파일은 좋은 일인 프로젝트의 다른 리소스처럼 버전 제어에서 끝날 것입니다.

정말로 프로젝트 구조 외부에두고 싶다면 resources filtering을 사용하여 스프링 구성 파일을 필터링하고 빌드시 ${dataDir}을 설정하십시오.

+0

파일을 프로젝트 외부에 저장해야합니다. 응용 프로그램을 업데이트 할 때 덮어 써서는 안되기 때문입니다. 그러나 버전 관리하에 보관하는 것은 좋은 지적입니다. 그것에 대해 생각해보십시오. – Olvagor