[maven-2] 상위 디렉터리를 나타내는 Maven2 속성

다음과 같은 다중 모듈 프로젝트가 있습니다.

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. (확인 태그에 “../ ..”이 있어야하고 재정의 된 속성 자체에 “..”만 있어야하는 이유를 모르겠지만 그 방식으로 만 작동합니다.)