Неисправность начинается с плагина сборки maven
Мне жаль звучать невежественно здесь, но я новичок в Maven, и я ударился головой о что-то, что, я уверен, довольно просто.
docs говорят:
[...] проект может создать сборку ZIP, которая содержит артефакт JAR проекта в корневом каталоге, зависимости времени выполнения в каталоге lib/и оболочку script для запуска автономного приложения.
который точно, что я хочу сделать! Но я не могу показаться, что это произошло.
Мой POM выглядит следующим образом:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.anearalone</groupId>
<artifactId>myapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
[...]
<build>
<finalName>myapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assemble/dist.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>com.anearalone.myapp.CLI</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
а ссылочный файл dist.xml выглядит следующим образом:
<assembly>
<id>dist</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<outputDirectory>/</outputDirectory>
<source>src/main/bin/arkify.sh</source>
<fileMode>755</fileMode>
</file>
</files>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<includes>
<include>com.anearalone:myapp:jar:0.0.1-SNAPSHOT</include>
</includes>
<outputDirectory>/</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
Это позволяет получить макет, который я хочу в zip файле (хотя я уверен, что не вернусь туда правильно), но я получаю две банки в target/
(один в архиве zip, другой в корень), и ни одна из них не включает мою запись mainClass в результирующем MANIFEST.MF
.
Если я изменю project.packaging
на "pom", который, как я думал, может быть прав, конечно, дополнительная банка (в корне target/
исчезает, но я получаю следующее предупреждение:
[WARNING] Cannot include project artifact: com.anearalone:myapp:pom:0.0.1-SNAPSHOT; it doesn't have an associated file or directory.
[WARNING] The following patterns were never triggered in this artifact inclusion filter:
o 'com.anearalone:myapp'
... и действительно, мой артефакт находится не в архиве, и до сих пор нет записей, добавленных в MANIFEST.MF
.
У кого есть время, чтобы помочь новичку?
Ответы
Ответ 1
Если я правильно понял вашу проблему, ваш ZIP был правильно создан, но содержащийся в нем my-app-0.0.1-SNAPSHOT
(а также JAR, расположенный непосредственно в каталоге target/
) не включает ваш основной класс в файл MANIFEST.MF
Фактически, плагин assembly
не предназначен для выполнения такой задачи. Это задача плагина JAR, который предоставляет способ указывать в MANIFEST.MF
основной класс вашего проекта. Вы просто должны добавить эту конфигурацию в свой текущий pom.xml
:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>my.app.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
Что касается вашей попытки изменить упаковку проекта на упаковку pom
: это была плохая идея;) Действительно, упаковка pom
используется для проекта без каких-либо других ресурсов, кроме самого pom.xml
. Это действительно полезно для pom.xml
, которые определены как родительский проект других проектов или совокупные мультипликативные модули.