pom에 정의 된 Maven 속성에 액세스


81

일반 Maven 프로젝트 및 Maven 플러그인 프로젝트에서 pom에 정의 된 Maven 속성에 어떻게 액세스합니까?


1
어떤 종류의 정보에 관심이 있습니까? 버전이나 유사한 것이라면 매니페스트넣고 거기에서 읽는 것이 더 나은 생각 일 것입니다 .
Joachim Sauer 2012

1
Stack Overflow에는 이것에 대한 많은 포스트가 있습니다 : stackoverflow.com/search?q=read+pom+in+java 적어도 포스트 전에 살펴보세요. 따라서 편집 도우미가 표시해야합니다. Google도 마찬가지입니다.
Jean-Rémy Revy

감사합니다. 나는 이것이 정말 나쁜 습관이라는 것을 깨달았습니다. 다른 접근 방식을 시도 할 것입니다.
SparedWhisle

답변:


76

properties-maven-plugin 을 사용하여 properties컴파일 타임에 특정 pom 을 파일에 쓴 다음 런타임에 해당 파일을 읽습니다.

당신에 pom.xml 파일 :

<properties>
     <name>${project.name}</name>
     <version>${project.version}</version>
     <foo>bar</foo>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

그리고 .java에서 :

java.io.InputStream is = this.getClass().getResourceAsStream("my.properties");
java.util.Properties p = new Properties();
p.load(is);
String name = p.getProperty("name");
String version = p.getProperty("version");
String foo = p.getProperty("foo");

작동했지만 Eclipse가 무한 빌드 / Tomcat에 배포 루프 (빌드-> my.properties 생성-> 리소스 변경-> 빌드)에 빠졌으므로 단계를 compile. 그래도 적절한 솔루션인지 확실하지 않습니다.
Nikita Bosik

@atoregozh는 속성 파일을로드하는 대신 Guava 리소스를 사용할 것을 제안했습니다. 확인. 그러나 표준 API로이 예제를 최소화하기 위해 변경 사항을 되돌 렸습니다.
Leif Gruenwoldt 2016 년

2
안정적인 1.0.0 버전이 출시되었습니다
Pieter De Bie

25

Maven 및 Java 에서 시스템 변수 설정 다음 호출

System.getProperty("Key");

7
이것은 아마도 maven-exec-plugin을 사용하여 Maven에서 결과 빌드를 실행하는 경우에만 작동합니다. Maven을 사용하여 코드를 컴파일하는 경우 작동하지 않습니다.
데이비드 Pashley와

@DavidPashley, 사실입니다. 컴파일 전용의 경우 컴파일러 플러그인에서 변수를 설정해야한다고 생각합니다.
Santosh


6

Maven에는 이미 원하는 작업을 수행 할 수있는 솔루션이 있습니다.

POM.xml에서 MavenProject를 가져옵니다-pom 파서?

btw : Google 검색에서 첫 번째 히트;)

Model model = null;
FileReader reader = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

try {
     reader = new FileReader(pomfile); // <-- pomfile is your pom.xml
     model = mavenreader.read(reader);
     model.setPomFile(pomfile);
}catch(Exception ex){
     // do something better here
     ex.printStackTrace()
}

MavenProject project = new MavenProject(model);
project.getProperties() // <-- thats what you need

1
여기서 단일 링크 답변은 권장하지 않습니다 (대부분 연결된 리소스가 사라지면 쓸모 없게 될 수 있기 때문입니다). 적어도 여기에 게시 할 링크의 정보를 요약해야합니다.
Joachim Sauer 2012

2
이것은 정말 나쁜 습관입니다. maven 리소스 플러그인을 사용하십시오!
Mark Bakker

1
그가 Java 코드에서 속성에 액세스하려는 경우 왜 이것이 나쁜 습관이되어야합니까?
SWoeste

1
그러나 그가 자신의 pom (s)을 변경하고 싶거나 할 수 있다고 가정하는 경우에만. 나는 외부 파일 대신 pom 파일에 직접 속성을 갖는 것이 나쁠 수 있다는 것에 동의합니다. 해당 파일은 Java 속성 클래스로 읽을 수 있습니다. 그러나 다른 경우에는 어떻습니까? 그런 다음 maven-model은 트릭을 수행하는 가장 좋은 솔루션입니다 ... 그러나 David Dai가 정확히 무엇을하고 싶은지 우리에게 말하지 않기 전에 우리 모두는 추측하고 있습니다.
SWoeste

1
하나의 mvn pom 파일 (속성 포함)과 하나의 Java 응용 프로그램 (해당 pom 파일의 세부 정보를 읽고 싶은 위치)이 있다는 것도 제 이해였습니다. 실제로 maven을 실행하지 않고.
Andreas Dolk 2012

-4

JDOM (http://www.jdom.org/)을 사용하여 pom 파일을 구문 분석 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.