web-dev-qa-db-fra.com

Création de deux fichiers exécutables à l'aide de maven-Assembly-plugin

J'ai un projet Maven et je veux en créer deux fichiers jar exécutables. L'un sera utilisé de manière interactive par les utilisateurs et un second sera exécuté comme un travail planifié qui lit les fichiers journaux produits par le premier. À la fin, je m'attendrais à ce que les deux fichiers JAR soient identiques à l'exception de l'attribut Main-Class dans le fichier MANIFEST.MF.

J'utilise maven-antrun-plugin pour créer un fichier jar exécutable et cela semblait bien fonctionner jusqu'à ce que j'essaie de créer un deuxième fichier jar en introduisant des profils Maven. La section pertinente de mon fichier POM ressemble à ceci:

<profiles>
    <profile>
        <id>publisher</id>
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                ...
                <plugin>
                    <artifactId>maven-Assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${project.artifactId}</finalName>
                        <archive>
                            <manifest>
                                <mainClass>fully.qualified.path.Publisher</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>logReader</id>
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                ...
                <plugin>
                    <artifactId>maven-Assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${project.artifactId}-logReader</finalName>
                        <archive>
                            <manifest>
                                <mainClass>fully.qualified.path.LogReader</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Vraiment, la seule différence entre les deux est les éléments "finalName" et "mainClass" tels que définis dans le plugin.

Lorsque j'essaie d'exécuter mvn: package sur les deux profils (j'utilise IntelliJ IDEA, soit dit en passant), j'obtiens deux fichiers .jar, mais l'un est correct et l'autre est incorrect. Celui "correct" contient toutes les dépendances et un fichier MANIFEST.MF valide. Celui "incorrect" ne contient aucune dépendance et le fichier MANIFEST.MF n'a pas la propriété "Main-Class" dont j'ai besoin pour qu'il soit exécutable.

J'ai constaté que si je n'exécutais qu'un seul profil ou l'autre, cela fonctionnait bien, mais si j'essayais d'exécuter les deux profils en même temps, cela échouait. Je reçois également les notes suivantes dans mon journal, mais je dois admettre que je ne comprends pas complètement ce qu'ils disent:

[INFO] Building jar: .../target/publisher.jar
...
[INFO] Building jar: .../target/publisher-logReader.jar
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing.
Instead of attaching the Assembly file: .../target/publisher-logReader.jar, it will become the file for main project artifact.
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic!
[WARNING] Replacing pre-existing project main-artifact file: .../target/publisher.jar with Assembly file: .../target/publisher-logReader.jar

Des pensées à ce sujet? Est-il possible de produire deux fichiers jar avec un seul mvn: package de cette manière, ou suis-je en train d'aboyer le mauvais arbre?

Merci!

29
McGlone

Donc, dès que j'ai posté cela, j'ai trouvé ce fil:

Créez plusieurs jars exécutables (avec les dépendances incluses) à partir d'un seul projet Maven

Cela utilise une approche différente en ce qu'il n'utilise pas deux profils, il utilise deux exécutions, en tant que telles:

<plugin>
    <artifactId>maven-Assembly-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>build-publisher</id>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>fully.qualified.path.Publisher</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>${project.artifactId}</finalName>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
        <execution>
            <id>build-logReader</id>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>fully.qualified.path.LogReader</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>${project.artifactId}-logReader</finalName>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Cela à l'air de marcher. La morale de l'histoire semble être que je ne comprends pas complètement les profils ou quand ils doivent être utilisés.

46
McGlone