Ich habe ein Szenario, in dem mein Projekt in verschiedenen JDKs kompiliert werden muss und der resultierende Artefaktname basierend auf dem verwendeten JDK unterschiedlich sein sollte. Wenn der Projektname beispielsweise MyProject lautet und ich mvn install anrufe, muss er in JDK 1.4 und JDK 1.5 kompiliert werden, und schließlich bekomme ich zwei JAR des gleichen Projekts (MyProjectJDK14-1.0 und MyProjectJDK15-1.0). Ist das möglich?Das gleiche Projekt in Maven mit verschiedenen Artefakten erstellen (basierend auf JDK verwendet)
Antwort
Der Maven-Weg, dies zu tun, ist nicht die finalName
des Artefakts zu ändern, sondern einen Klassifikator zu verwenden. Zum Beispiel:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>${envClassifier}</classifier>
</configuration>
</plugin>
</plugins>
</build>
...
<profiles>
<profile>
<id>jdk16</id>
<activation>
<jdk>1.6</jdk>
</activation>
<properties>
<envClassifier>jdk16</envClassifier>
</properties>
</profile>
<profile>
<id>jdk15</id>
<activation>
<jdk>1.5</jdk>
</activation>
<properties>
<envClassifier>jdk15</envClassifier>
</properties>
</profile>
</profiles>
</project>
Der JAR-Artefakt wird ${finalName}-${envClassifier}.jar
genannt werden und enthielt als Abhängigkeit der folgende Syntax:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<classifier>jdk16</classifier>
</dependency>
Du musst die Maven zweimal beiden Gläser zu produzieren, bauen nennen (a anständiger CI-Motor tun kann).
Was Sie tun können, ist zwei profiles zu definieren, eine pro JDK verwendet. Jedes Profil wird aktiviert darüber, welche JDK verwendet wird:
<profiles>
<profile>
<id>profile-for-jdk1.4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.4</finalName>
</build>
</profile>
<profile>
<id>profile-for-jdk1.5</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.5</finalName>
</build>
</profile>
</profiles>
Dann in jedem Profil definieren Sie eine bestimmte <finalName>
, die verwendet wird, um die erzeugte JAR-Datei zu benennen.
Wenn Sie also Ihre Anwendung mit JDK 1.4 erstellen, erhält das generierte JAR den Namen myBuild-jdk1.4.jar
.
Wenn das endgültige Paket mit einer Baugruppe erstellt wird, können Sie einfach die <build>
Block-Innenprofile ändern, um das Baugruppen-Plugin zu konfigurieren (z. B. zu <finalName>
).
In Bezug auf Ihre Bemerkung: der Tat dieses Verfahren müssen zwei getrennte auf Maven baut, wie Sie das gesamte Projekt neu kompilieren, wenn die JDK-Version zu ändern. Eine der Maven2-Konventionen ist, dass ein Projekt = ein Artefakt ist. Was Sie wollen, ist ein Projekt mit zwei Artefakten.
Schließlich ist eine Lösung, Hudson zu verwenden, um Ihre Anwendung und speziell die matrix feature dieses Tools zu erstellen, das Ihnen ermöglicht, mehrere Builds mit verschiedenen Parametern auszuführen, in Ihrem Fall das JDK.
Verwenden Sie Maven-Profile. Fügen Sie diesen Abschnitt im Inneren des project
-Tag Ihrer pom.xml
:
<profiles>
<profile>
<activation>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.4</finalName>
</build>
</profile>
<profile>
<activation>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.5</finalName>
</build>
</profile>
</profiles>
this Sehen Sie mehr über Profile kennen.
Hallo Abhin4v, danke für die Antwort. Ich denke, dass diese Lösung funktionieren wird, wenn ich den Maven Build zweimal mit verschiedenen JDKs aufrufen werde, dachte ich nur, ob es möglich ist, beide Gläser in einem einzigen go.ie Call Maven installieren, und Sie erhalten zwei Gläser als Ausgabe, eine kompiliert mit JDK1.4 und die andere mit JDK1.5 ... Irgendwelche Ideen ??? – Manoj
Es gibt tatsächlich eine Möglichkeit, mehr als eine WAR mit einem Build zu erstellen (ich denke, das funktioniert auch für JARs): Sie können das Assembly-Plugin mit mehreren Ausführungen für verschiedene Deskriptoren verwenden.
Ein ähnliches Problem ist die unterschiedlichen Varianten des JDBC-API in verschiedenen Versionen des JDK verwendet.
entschied ich, dass diese etwas andere arifactIds benötigt als Klassifizierer.
Sie können dies erreichen, indem eine Eigenschaft in Einstellungen speichern und Referenzierung diese dann im artifactId tag:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>throwing-jdbc-${jdbc.version}</artifactId>
<name>Throwing JDBC</name>
<profiles>
<profile>
<id>jdbc3</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>[1.3,1.4,1.5]</jdk>
</activation>
<properties>
<jdbc.version>3.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<sources>
<source>src/jdbc3-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<jdbc.version>4.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc41</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<jdbc.version>4.1</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4.1/java</source>
<source>src/jdbc4.1-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 1. Parallele Downloads von Maven-Artefakten
- 2. Java baut mit verschiedenen JDK-Versionen: gleiche Artefakte?
- 3. Maven bauen mit falscher JDK auf jenkins
- 4. Abwärtskompatibilität von zwei Maven-Artefakten testen
- 5. Gleiche Schnittstelle in verschiedenen Domänen/Projekt
- 6. Wie wird AutoIt mit Maven-Projekt verwendet?
- 7. Erstellen Sie eine Liste von Artefakten, die
- 8. Maven-Projektabhängigkeit gegen JDK-Version
- 9. Maven zeigt auf das falsche Verzeichnis von JDK
- 10. Erstellen von Pluggable-Projekt mit Maven
- 11. Maven-Repository-Nutzung zum Download von Artefakten
- 12. Gurke: Wie man die gleiche Regex in verschiedenen Transformationen verwendet?
- 13. Konfigurieren von jcenter für das Herunterladen von Artefakten und Artefakten für die Bereitstellung von Artefakten
- 14. Installation von Maven-Artefakten in lokale Repos programmgesteuert
- 15. Java 8 Streams: Map das gleiche Objekt mehrmals basierend auf verschiedenen Eigenschaften
- 16. Gradle Application Plugin - Erstellen mehrerer Start-Skripte/-Dists für das gleiche Projekt mit anderen mainClassName
- 17. IntelliJ Einfuhren Projekt aus POM mit falscher JDK Version
- 18. Ungültiges Projekt JDK
- 19. Ich möchte das gleiche UserInterface mit verschiedenen Daten in ios
- 20. Welches JDK/JRE verwendet ein bestimmtes Eclipse-Projekt?
- 21. Wird das maven-native-plugin zum Erstellen von C++ - Projekten mit maven verwendet?
- 22. Maven: Kompilieren und Testen auf verschiedenen Quellenebenen
- 23. gleiche URL ('/') mit verschiedenen Vorlagen basierend auf Login-Status in AngularJS
- 24. Backup-Projekt, das Git verwendet
- 25. Erstellen Desktop-Glas von Netbeans/Maven-Projekt
- 26. VerrifyError mit Guice auf Android Maven-Projekt
- 27. Maven Standardgebietsschema nicht gleiche mit OS locale
- 28. verschiedenen Tabellen basierend auf Spaltenwert
- 29. Multi-Modul-Projekt von Maven in eine Kriegsdatei erstellen
- 30. Wie kann ich Maven Gwt Projekt erstellen?
Hallo romaintaz, danke für die Antwort. Ich denke, dass diese Lösung funktionieren wird, wenn ich den Maven Build zweimal mit verschiedenen JDKs aufrufen werde, dachte ich nur, ob es möglich ist, beide Gläser in einem einzigen go.ie Call Maven installieren, und Sie erhalten zwei Gläser als Ausgabe, eine kompiliert mit JDK1.4 und die andere mit JDK1.5 ... Irgendwelche Ideen ??? – Manoj
@Manoj, siehe meine Bearbeitung. – romaintaz
Danke romaintaz ... Ich benutze Hudson in meinem Setup ... Ich war nur auf der Suche nach einer Möglichkeit, es mit Maven alleine zu machen. Anywayz scheint wie HUdson der einzige Weg zu gehen. – Manoj