상위 POM의 프로필에 대해 이미 정의 된 플러그인의 구성을 재정의 할 수 있습니까?


109

내 프로젝트의 POM 상위 파일에는이 프로젝트에 유용한 몇 가지 구성을 정의하는 프로필이 있습니다 (이 상위 POM을 제거 할 수 없음).

<profile>
<id>wls7</id>
...
<build>
  <plugins>
    <!-- use java 1.4 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <source>1.4</source>
        <target>1.4</target>
        <meminitial>128m</meminitial>
        <maxmem>1024m</maxmem>
        <executable>%${jdk14.executable}</executable>
      </configuration>
    </plugin>
  </plugins>
</build>

...
</profile>

그러나 내 프로젝트에서는 테스트 클래스를 컴파일하는 데 jdk4 대신 jdk5를 사용하기 위해 maven-compiler-plugin의 구성을 재정의하고 싶습니다.

이것이 내 프로젝트의 POM에서이 섹션을 수행 한 이유입니다.

<profiles>
  <profile>
    <id>wls7</id>
        <activation>
            <property>
                <name>jdk</name>
                <value>4</value>
            </property>
        </activation>
    <build>
      <directory>target-1.4</directory>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <executions>
            <execution>
              <id>my-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <fork>true</fork>
                <executable>${jdk15.executable}</executable>
                <compilerVersion>1.5</compilerVersion>
                <source>1.5</source>
                <target>1.5</target>
                <verbose>true</verbose>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
              ...
</profiles>

작동하지 않습니다 ...

내 POM의 일반 플러그인 섹션에서 구성을 재정의하려고 시도했습니다 (특정 프로필이 아니라 전체 POM에 대한 것입니다).

무엇이 문제일까요?

내 요구 사항 중 일부를 명확히하려면 다음을 수행하십시오.

  • 부모 POM과 그 안에 정의 된 프로필 (wls7)을 제거하고 싶지 않습니다 (많은 속성, 구성 등이 필요하기 때문에 ...). 그것은 우리 회사의 프로세스가 아닙니다.
  • 상위 POM 및 / 또는 그 안에 정의 된 프로필을 복제하는 데 기반한 솔루션은 좋지 않습니다.
    부모 POM 의 책임자가 무언가를 변경
    하면 내보고를해야 할 것입니다.

상속 문제 (상위 수준 POM의 구성 인 프로필 확장 또는 재정의)이므로 Maven 2에서 가능해야한다고 생각합니다.


wls7 프로파일은 어떻게 활성화됩니까?
Pascal Thivent

프로파일 wls7 및 wls10은 모두 상위 POM에서 "activeByDefault"입니다. 그러나 고객의 요구에 따라 wls10 만 또는 둘 다 스크립트로 빌드됩니다 ( "-P"매개 변수 사용)
Guillaume Cernier

답변:


144

부모 pom에서 구성을 재정의하는 것은 pom combine.self="override"의 요소에 속성을 추가하여 수행 할 수 있습니다 .

플러그인 구성을 다음으로 변경해보십시오.

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>my-testCompile</id>
          <phase>test-compile</phase>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration combine.self="override">
            <fork>true</fork>
            <executable>${jdk15.executable}</executable>
            <compilerVersion>1.5</compilerVersion>
            <source>1.5</source>
            <target>1.5</target>
            <verbose>true</verbose>
          </configuration>
        </execution>
      </executions>
    </plugin>

플러그인 재정의에 대한 자세한 내용은 http://maven.apache.org/pom.html을 참조하십시오.


Maven2.2.1의 경우 프로필에서이 작업을 수행하면 부모 프로필에 정의 된 플러그인과 병합되지 않고 재정의됩니다. 빌드 섹션에서 동일한 플러그인을 직접 정의하면 작동합니다. Maven3의 경우 예상대로 해결되었습니다.
Greg Domjan

그것은 나를 위해 작동하지 않았습니다. Maven 3.3.9를 사용하여 pom.xml에서 org.jenkins-ci.plugins 버전 1.580.1로 Jenkins NodeJS Plugin v1.0을 다시 빌드하고 싶었습니다. ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom에서 수동으로 <source>를 1.7로 변경하기 전까지는 아무것도 작동하지 않았습니다.
Alexander Samoylov

6

나는 같은 문제가 있었다. 기본적으로 내 maven war 플러그인은 html 파일을 제외했습니다. 하지만 내 수락 테스트 프로필에이 파일이 포함되기를 원했습니다. 그래서 maven war 플러그인을 다시 추가했을 때 기본값을 재정의하지 않았습니다.

이 문제를 해결하기 위해 combine.self 속성을 전달하고 제대로 작동했습니다.

기본 빌드 :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <packagingExcludes>swagger-ui/client.html</packagingExcludes>
    </configuration>
</plugin>

수락 테스트 프로필 :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>

1

wls7 프로파일 비활성화를 시도 했습니까 (maven 2.0.10 이후) :

Maven 2.0.10부터는 식별자 앞에 '!'문자를 붙여서 명령 줄을 사용하여 하나 이상의 프로필을 비활성화 할 수 있습니다. 또는 아래와 같이 '-':

mvn groupId:artifactId:goal -P !profile-1,!profile-2

이것은 activeByDefault로 표시된 프로필 또는 활성화 구성을 통해 활성화 될 프로필을 비활성화하는 데 사용할 수 있습니다.

그런 다음 구성을 다른 이름의 프로필에 추가하거나 pom.xml.


위에서 말했듯이 프레임 워크의 다른 수준에서 모든 회사에 대해 정의 된 많은 구성을 상속하므로 상위 POM을 제거 할 수 없습니다. 프로필을 복제하는 것은 좋은 생각이 아니어야합니다. 부모 POM의 변경 사항을보고해야하고 대부분 알지 못하기 때문입니다. 내 프로젝트에서 테스트 클래스를 컴파일하는 경우에만 동작을 재정의하고 싶습니다.
Guillaume Cernier

내 대답을 다시 읽으십시오. 그것은 내가 제안한 것이 아닙니다. 부모 POM을 제거하는 것이 아니라 프로필을 비활성화 할 것을 제안했습니다. 그렇다면 왜 부모 pom의 변경 사항을보고해야합니까? 그렇게하도록 강요하는 것은 없습니다.
Pascal Thivent

예, Pascal, 도움을 주셔서 감사합니다.하지만 문제는 wls7 프로필을 비활성화하면 많은 구성을 제거한다는 것입니다 (다른 플러그인, maven 일반 항목의 경우 ...). 변경 사항을보고한다는 것은 부모 POM에서 내 POM으로라는 의미입니다. 제안한 솔루션을 사용하면 모든 상위 POM을 복제해야하고 (테스트 클래스 컴파일 섹션 제외) 상위 POM 책임이 자신의 POM에서 무언가를 변경하면 다음과 같은 변경 사항에 대해 경고해야합니다. 현재 프로세스가 아니고 실용적이지 않습니다.
Guillaume Cernier

오, 알았어요. 이제 알겠습니다. 그러나 나는 확신하지 못하지만 (하지만 내가 틀릴 수 있음) pom을 부분적으로 재정의 할 수 있으므로 제공된 세부 정보로 더 나은 해결책이 없습니다.
Pascal Thivent

어쨌든 저를 도와 주신 Pascal에게 감사드립니다. 사실 저는 특별한 이유 때문에 그런 행동이 필요합니다. 아마도 그것을 수행하는 다른 방법이있을 것입니다 :
Guillaume Cernier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.