다음과 같은 다중 모듈 프로젝트가 있습니다.
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Maven2에서 (내 프로젝트를 릴리스하려는 환경에 따라 달라지는) 속성 집합을 정의해야합니다. <properties>
속성이 많기 때문에 사용하지 않겠습니다 . 따라서 Properties Maven2 플러그인을 사용합니다 .
속성 파일은 main-project/
디렉터리에 있습니다. 속성 파일을 찾을 위치를 자식에게 지정하기 위해 기본 pom.xml에 올바른 디렉토리를 어떻게 설정할 수 있습니까?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
만 설정 <file>env_${env}.properties</file>
하면 Maven2가 첫 번째 모듈을 컴파일 할 때 main-project/env_dev.properties
파일을 찾지 못합니다 . 을 설정 <file>../env_${env}.properties</file>
하면 상위 수준 또는 하위 모듈 수준에서 오류가 발생합니다.
답변
각 pom에 속성을 설정하여 기본 프로젝트 디렉토리를 찾으십시오.
부모 :
<properties>
<main.basedir>${project.basedir}</main.basedir>
</properties>
아이들의 경우 :
<properties>
<main.basedir>${project.parent.basedir}</main.basedir>
</properties>
손자 :
<properties>
<main.basedir>${project.parent.parent.basedir}</main.basedir>
</properties>
답변
적어도 현재 maven 버전 (3.6.0)에서는 다음을 사용할 수 있습니다. ${maven.multiModuleProjectDirectory}
답변
목표 디렉토리와 함께 directory-maven-plugin을 사용하십시오 .
다른 제안과 달리 :
- 이 솔루션은 다중 모듈 프로젝트에서 작동합니다.
- 전체 프로젝트를 빌드하든 하위 모듈을 빌드하든 작동합니다.
- 루트 폴더 또는 하위 모듈에서 maven을 실행하는지 여부에 관계없이 작동합니다.
- 각각의 모든 하위 모듈에서 상대 경로 속성을 설정할 필요가 없습니다!
플러그인을 사용하면 선택한 속성을 프로젝트 모듈의 절대 경로로 설정할 수 있습니다. 제 경우에는 루트 모듈로 설정했습니다. 프로젝트 루트 pom에서 :
<plugin>
<groupId>org.commonjava.maven.plugins</groupId>
<artifactId>directory-maven-plugin</artifactId>
<version>0.1</version>
<executions>
<execution>
<id>directories</id>
<goals>
<goal>directory-of</goal>
</goals>
<phase>initialize</phase>
<configuration>
<property>myproject.basedir</property>
<project>
<groupId>com.my.domain</groupId>
<artifactId>my-root-artifact</artifactId>
</project>
</configuration>
</execution>
</executions>
</plugin>
그때부터 모든 하위 모듈 pom의 $ {myproject.basedir}에는 항상 프로젝트 루트 모듈의 경로가 있습니다. 물론, 루트뿐만 아니라 모든 모듈에 속성을 설정할 수 있습니다.
답변
내 문제를 해결할 해결책을 찾았습니다. Groovy Maven 플러그인을 사용하여 속성 파일을 검색합니다.
내 속성 파일은 반드시 현재 디렉터리, ../ 또는 ../ ..에 있으므로이 세 폴더를 확인하는 작은 Groovy 코드를 작성했습니다.
다음은 내 pom.xml의 추출입니다.
<!-- Use Groovy to search the location of the properties file. -->
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.0-rc-5</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
import java.io.File;
String p = project.properties['env-properties-file'];
File f = new File(p);
if (!f.exists()) {
f = new File("../" + p);
if (!f.exists()) {
f = new File("../../" + p);
}
}
project.properties['env-properties-file-by-groovy'] = f.getAbsolutePath();
</source>
</configuration>
</execution>
</executions>
</plugin>
<!-- Now, I can load the properties file using the new 'env-properties-file-by-groovy' property. -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>${env-properties-file-by-groovy}</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
이것은 효과가 있지만 정말 마음에 들지 않습니다.
따라서 더 나은 솔루션이 있다면 주저하지 말고 게시하십시오!
답변
그래서 내가 보는 문제는 maven에서 부모 디렉토리에 대한 절대 경로를 얻을 수 없다는 것입니다.
<rant> 나는 이것이 반 패턴이라고 말하는 것을 들었지만, 모든 반 패턴에는 그것에 대한 실제적이고 합법적 인 사용 사례가 있으며, 나는 그들의 패턴 만 따를 수 있다고 말하는 메이븐이 지겨워 요. </ 폭언>
그래서 제가 찾은 일은 antrun을 사용하는 것이 었습니다. 자식 pom.xml에서 이것을 시도하십시오.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>getMainBaseDir</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<exportAntProperties>true</exportAntProperties>
<target>
<!--Adjust the location below to your directory structure -->
<property name="main.basedir" location="./.." />
<echo message="main.basedir=${main.basedir}"/>
</target>
</configuration>
</execution>
</executions>
</plugin>
실행 mvn verify
하면 다음과 같은 내용이 표시됩니다.
main:
[echo] main.basedir=C:\src\parent.project.dir.name
그런 다음 ${main.basedir}
다른 플러그인 등에서 사용할 수 있습니다 .이 문제를 해결하는 데 시간이 좀 걸렸으므로 다른 사람에게 도움이되기를 바랍니다.
답변
또 다른 대안 :
부모 pom에서 다음을 사용하십시오.
<properties>
<rootDir>${session.executionRootDirectory}</rootDir>
<properties>
어린이 poms에서이 변수를 참조 할 수 있습니다.
주요 경고 : 항상 기본 상위 pom 디렉토리에서 명령을 실행하도록합니다. 그런 다음 특정 모듈에 대해서만 명령 (예 : 테스트)을 실행하려면 다음 구문을 사용합니다.
mvn 테스트-프로젝트
“path_to_test_data”변수를 매개 변수화하기위한 surefire의 구성은 다음과 같습니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.plugin.version}</version>
<configuration>
<systemPropertyVariables>
<path_to_test_data>${rootDir}/../testdata</path_to_test_data>
</systemPropertyVariables>
</configuration>
</plugin>
답변
다음 작은 프로필이 저에게 효과적이었습니다. config
프로젝트 루트의 디렉토리에 넣은 CheckStyle에 대한 이러한 구성이 필요 했기 때문에 메인 모듈과 하위 모듈에서 실행할 수 있습니다.
<profile>
<id>root-dir</id>
<activation>
<file>
<exists>${project.basedir}/../../config/checkstyle.xml</exists>
</file>
</activation>
<properties>
<project.config.path>${project.basedir}/../config</project.config.path>
</properties>
</profile>
중첩 된 모듈에서는 작동하지 않지만의 프로필이 다른 여러 프로필을 사용하여 수정할 수 있다고 확신합니다 exists
. (확인 태그에 “../ ..”이 있어야하고 재정의 된 속성 자체에 “..”만 있어야하는 이유를 모르겠지만 그 방식으로 만 작동합니다.)