Я начинаю работать с Maven, но пока не думаю, что Условия Maven. У меня есть конкретное требование, и документы не дают мне достаточно подсказок, поэтому я мог бы немного помочь:
Я хотел бы создать сборку, которая
создает jar-with-dependencies
как «стандартная» цель этого имени, но исключая пару ресурсов. Я хочу, чтобы log4j.properties
и несколько других файлов конфигурации, чтобы не находились в jar.
создает файл .ZIP
, содержащийся в его корневом каталоге. .jar
из шага 1, а также вышеупомянутые файлы конфигурации.
Я хочу запустить эту сборку из командной строки (только), поэтому нет необходимости привязываться к фазе (или цели) ? mojo?). Предпочтительно использовать сборку : сборка
или сборку : одиночная
.
pom.xml
? Так что это идет в src / Assembly / что-то. xml
и получает ссылку с помощью descriptorRef
? Я начинаю работать с Maven, но пока не могу думать в терминах Maven.
Добро пожаловать на борт, Карл! : D
Я хочу запустить эту сборку из командной строки (только), поэтому нет необходимости привязываться к фазе (или цели? Mojo?). Предпочтительно использовать сборку: сборку или сборку: одиночную.
Для пояснения: жизненный цикл сборки сам по себе состоит из фаз
(компиляция, тестирование, пакет и т. Д.), А цели плагина (технически Mojos) привязаны к фазам. Затем вы либо вызываете фазу ..., либо просто конкретную цель плагина.
Нужен ли для этого специальный дескриптор сборки?
Ну, поскольку вам нужно поведение, которое не покрывают предопределенные дескрипторы , то да. Вам даже понадобятся два из них (из них для uberjar, один для застежки-молнии).
И правда ли, что я не могу вложить его в pom.xml? Итак, он идет в src / assembly / something.xml и на него ссылается descriptorRef?
Да, это правда (дескрипторы используют собственный формат), и они обычно попадают в src / main / assembly
.И нет, descriptorRef
предназначен для встроенных дескрипторов, здесь вам нужно будет использовать дескриптор
.
Могу ли я закодировать это как две относительно простые сборки, одна из которых построена на другой (т.е. сборка .Zip использует сборку .Jar), или мне нужно делать все в одной сборке?
Как уже намекнули, вы потребуются два дескриптора сборки. Позвольте мне немного помочь ...
Предположим, у вас есть следующая структура проекта:
$ tree . . ├── pom.xml └── src ├── main │ ├── assembly │ │ ├── jar.xml │ │ └── zip.xml │ ├── java │ │ └── com │ │ └── stackoverflow │ │ └── App.java │ └── resources │ └── log4j.properties └── test └── java └── com └── stackoverflow └── AppTest.java
Где pom.xml
содержит следующую конфигурацию для подключаемого модуля сборки:
<project>
...
<dependencies>
...
</dependencies>
...
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/jar.xml</descriptor>
<descriptor>src/main/assembly/zip.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Дескриптор для "отфильтрованный" uberjar (jar.xml) выглядит так:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
Этот дескриптор (вкратце) делает следующее:
И дескриптор для zip-архива (zip.xml) выглядит так:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/resources</directory>
<outputDirectory/>
<includes>
<include>log4j.properties</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory/>
<includes>
<include>*-uberjar.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Что (как-то) объясняет:)
) в корне сборки
) в корне сборки Наконец, просто запустите mvn assembly: assembly
(эта цель предназначена для использования в интерфейсе командной строки).
Я (сознательно) не включил META-INF / maven / ** в сборку для uberjar. Есть ли простой способ предотвратить их включение?
Они поступают из распакованных библиотек. Вы можете исключить их, используя unpackOptions
.Вот модифицированная версия jar.xml
:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<unpackOptions>
<excludes>
<exclude>META-INF/maven/**</exclude>
</excludes>
</unpackOptions>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>