2013-07-14 22 views
9

Moje pytanie zostało skierowane w this thread, ale wyjaśnienie nie jest jasne.Profil Maven 3 z rozszerzeniami

mam tę definicję gromadzeniu w jednym z moich plików pom.xml:

<build> 
    <finalName>${my.project}</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
    <extensions> 
     <extension> 
      <groupId>org.kuali.maven.wagons</groupId> 
      <artifactId>maven-s3-wagon</artifactId> 
      <version>1.1.19</version> 
     </extension> 
    </extensions> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/settings.properties</include> 
      </includes> 
     </resource> 
    </resources> 
</build> 

Zauważ, że używam rozszerzenie Maven-s3-wagonu. Następnie chciałbym mieć 2 różne profile, każdy z własnymi ustawieniami, wtyczkami i rozszerzeniami, ale maven nie zezwala na tag rozszerzenia pod profilem.

Kiedy próbuję przy użyciu profilu:

<profiles> 
    <profile> 
     <id>local-build</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
      <finalName>${my.project}</finalName> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>2.0</version> 
        <configuration> 
         <source>1.6</source> 
         <target>1.6</target> 
        </configuration> 
       </plugin> 
      </plugins> 
      <extensions> 
       <extension> 
        <groupId>org.kuali.maven.wagons</groupId> 
        <artifactId>maven-s3-wagon</artifactId> 
        <version>1.1.19</version> 
       </extension> 
      </extensions> 
      <resources> 
       <resource> 
        <directory>src/main/resources</directory> 
        <filtering>true</filtering> 
        <includes> 
         <include>**/settings.properties</include> 
        </includes> 
       </resource> 
      </resources> 
     </build> 
    </profile> 
</profiles> 

Dostaję błąd w moim pom:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'extensions'. One of '{"http://maven.apache.org/POM/4.0.0":defaultGoal, "http://maven.apache.org/POM/ 
4.0.0":resources, "http://maven.apache.org/POM/4.0.0":testResources, "http://maven.apache.org/POM/4.0.0":directory, "http://maven.apache.org/POM/4.0.0":filters, "http:// 
maven.apache.org/POM/4.0.0":pluginManagement}' is expected. 

Pytanie Więc za pomocą znacznika rozszerzenia oznacza, że ​​nie można korzystać z profili? Jak mogę używać lub zmieniać rozszerzenia budowania za pośrednictwem profilu?

Odpowiedz

4

Rzeczywiście, urzędnik Maven POM reference nie jest jasne, o możliwym wykorzystaniu extensions jako część profilu Maven, ponieważ stwierdza, można mieć element build w nim, ale nie co sekcji build.

Jednak oficjalny Maven model skutecznie filtruje i dostarcza informacje na temat sekcji build, z której można korzystać w sekcji profile. I rzeczywiście extensionsnie istnieje.

Czym są rozszerzenia Maven? Build/Lifecycle enhancement, ale także (i zasadniczo): biblioteka dodana do ścieżki klasy środowiska wykonawczego kompilacji Maven, która uczestniczy w kompilacji, ale nie jest spakowana z ostatecznym artefaktem.

Dlatego w takiej sytuacji (jeśli trzeba mieć rozszerzenia w profilu lub mieć profil, aby zmienić/dodać rozszerzenie) można użyć następującej sztuczki:

  • mają nieszkodliwe rozszerzenie jako domyślnym rozszerzeniem swojej produkcji (gdzie nieszkodliwe środki cokolwiek biblioteki, które mogłyby być częścią budowania ścieżki klasy i zasadniczo nie wpływa to w ogóle)
  • mają właściwości określających współrzędne GAV (G roupId, rtifactId, V ersion) tego się rozszerza jon
  • mieć profil, który zasłania tych właściwości do pożądanego (użyteczną) przedłużenia

Na przykład, biorąc pod uwagę następujący przykładowy POM:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>project</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <properties> 
     <extension.groupId>junit</extension.groupId> 
     <extension.artifactId>junit</extension.artifactId> 
     <extension.version>4.11</extension.version> 
    </properties> 

    <build> 
     <extensions> 
      <extension> 
       <groupId>${extension.groupId}</groupId> 
       <artifactId>${extension.artifactId}</artifactId> 
       <version>${extension.version}</version> 
      </extension> 
     </extensions> 
    </build> 

    <profiles> 
     <profile> 
      <id>customize-extension</id> 
      <properties> 
       <extension.groupId>junit</extension.groupId> 
       <extension.artifactId>junit</extension.artifactId> 
       <extension.version>4.12</extension.version> 
      </properties> 
     </profile> 
    </profiles> 

</project> 

Domyślna wykonania (bez profilu customize-extension aktywowane), użyłby domyślnie zdefiniowanego properties i jako taki dodaje junit jako rozszerzenie kompilacji: jest to nieszkodliwe (chociaż może powodować konflikty z inną wersją kompilacji junit, więc upewnij się, że używasz tej samej wersji użycia, nawet bardziej nieszkodliwej biblioteka do tego).

Można sprawdzić Maven będzie go podnieść uruchamiając naprawdę pierwszy build phase, żeby sprawdzić informację w naszym przypadku, i włączyć flagę debug:

mvn initialize -X 

i sprawdzanie jako część dziennika budowy:

[DEBUG] Populating class realm extension>junit:junit:4.11 
[DEBUG] Included: junit:junit:jar:4.11 

teraz użyjmy naszego lewy: dodajmy (zmiana) poprzez rozszerzenie build profilu:

mvn initialize -X -Pcustomize-extension 

i jako część naszego dziennika budowy musielibyśmy:

[DEBUG] Populating class realm extension>junit:junit:4.12 
[DEBUG] Included: junit:junit:jar:4.12 

Bingo. Maven wybrał inne rozszerzenie (w tym przypadku inną wersję, 4.12) i udało nam się zmienić (lub faktycznie dodać sensowne) rozszerzenie kompilacji za pośrednictwem profilu.

0

Tylko szalony pomysł: użycie modułów

zdefiniować rodzica pom tak:

<groupId>org.example</groupId> 
<artifactId>my-parent</artifactId> 
<version>1.0</version> 
<packaging>pom</packaging> 
<profiles> 
    <profile> 
     <id>use-pom1</id> 
     <modules> 
      <module>pom1</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>use-pom2</id> 
     <modules> 
      <module>pom2</module> 
     </modules> 
    </profile> 
</profiles> 

Określ żądane rozszerzenia na pom1 i pom2.

+0

rzeczywiście interesujące pomysł, ale może to skomplikować. Ponieważ jest to system produkcji na stosie, próbuję znaleźć prostsze rozwiązanie \ stable \ official \ tested. Dzięki za to – forhas

+0

Cóż, możesz spróbować użyć 'maven-assembly-plugin', używając descriptor.xml. Ale wątpię, czy zrobiłby to, co robią twoje rozszerzenia. –

0

myślę roztwór o http://maven.apache.org/guides/mini/guide-using-extensions.html

definiują sekcję gromadzeniu której rozszerzanie są określane, a następnie w zadany profil atrybut prawdziwy (jak w drugim profilem pokazanym poniżej)

<build> 
    <extensions> 
     <extension> 
      <groupId>org.apache.maven.wagon</groupId> 
      <artifactId>wagon-ssh</artifactId> 
      <version>2.9</version> 
     </extension> 
    </extensions> 
</build> 

<profiles> 
    <profile> 
     <id>create-default</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <goals> 
           <goal>repackage</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

    <profile> 
     <id>create-core</id> 
     <activation> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-jar-plugin</artifactId> 
        <extensions>true</extensions> 
        <version>2.6</version> 
        <configuration> 
         <finalName>import-station-core-${project.version}</finalName> 
        </configuration> 
        <executions> 
         <execution> 
          <id>make-jar</id> 
          <phase>package</phase> 
          <goals> 
           <goal>jar</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
Powiązane problemy