Подтвердить что ты не робот

Создание двух исполняемых банок с использованием maven-assembly-plugin

У меня есть проект Maven, и я хочу создать из него два исполняемых файла jar. Один из них будет использоваться интерактивно пользователями, а второй будет выполняться как запланированное задание, которое считывает файлы журналов, созданные первым. В конце концов, я ожидал бы, что два файла jar будут идентичными, за исключением атрибута Main-Class в файле MANIFEST.MF.

Я использую maven-antrun-plugin для создания исполняемого банку, и это, казалось, работает нормально, пока я не попытался создать второй файл jar, представив профили Maven. Соответствующий раздел моего POM файла выглядит следующим образом:

<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>

Действительно, единственное различие между ними - это элементы "finalName" и "mainClass", определенные в плагине.

Когда я пытаюсь выполнить mvn: package в обоих профилях (я использую IntelliJ IDEA, кстати), я получаю два файла .jar, но один правильный, а другой неверный. "Правильный" содержит все зависимости и действительный файл MANIFEST.MF. "Неверный" не содержит зависимостей, а в файле MANIFEST.MF отсутствует свойство "Main-Class", которое мне нужно для его выполнения.

Я обнаружил, что если я когда-либо запускаю только один профиль или другой, то он работает нормально, но если я попытаюсь выполнить оба профиля одновременно, это не сработает. Я также получаю следующие примечания в своем журнале, но я должен признать, что я не совсем понимаю, что они говорят:

[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

Любые мысли об этом? Можно ли создать два файла jar с одним пакетом mvn: таким образом, или я лаяю неправильное дерево?

Спасибо!

4b9b3361

Ответ 1

Итак, как только я разместил это, я нашел этот поток:

Создайте несколько запущенных банок (с включенными ограничениями) из одного проекта Maven

В этом случае используется другой подход, поскольку он не использует два профиля, он использует два исполнения:

<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>

Кажется, это работает. Мораль этой истории, похоже, заключается в том, что я не полностью понимаю профили или когда они должны использоваться.