Таможенная сборка maven - PullRequest
       2

Таможенная сборка maven

8 голосов
/ 16 августа 2010

Я начинаю работать с Maven, но пока не думаю, что с точки зрения Maven.У меня есть конкретное требование, и документы не дают мне достаточно подсказок, поэтому я мог бы немного помочь:

Я хотел бы создать сборку, которая

  1. создает jar-with-dependencies как «стандартную» цель этого имени, но исключая пару ресурсов.Я хочу, чтобы log4j.properties и несколько других файлов конфигурации, чтобы не находились в банке.

  2. создает файл .ZIP, содержащий в своем корневом каталоге .jar из шага 1, а также вышеупомянутые конфигурационные файлы.

Я хочу запустить эту сборку из командной строки (только), поэтому нет необходимости привязываться к фазе (или цель? моджо?).Предпочтительно использовать assembly:assembly или assembly:single.

  • Нужен ли для этого собственный дескриптор сборки?
  • И правда ли, что я не могу вложить это в pom.xml?Таким образом, он входит в src/assembly/something.xml и получает ссылку descriptorRef?
  • Могу ли я закодировать это как две относительно простые сборки, одна из которых построена на другой (т.е.) или мне все надо делать в одной сборке?

1 Ответ

27 голосов
/ 16 августа 2010

Я начинаю работать с Maven, но пока не думаю, что это нормально, если говорить о Maven.

Добро пожаловать на борт, Карл! : D

Я хочу запустить эту сборку из командной строки (только), поэтому нет необходимости привязываться к фазе (или цели? Mojo?). Предпочтительно использовать либо сборку: сборку, либо сборку: одиночную.

Просто для пояснения: сам жизненный цикл сборки состоит из phases (компиляция, тестирование, пакетирование и т. Д.), А цели плагинов (технически Mojos) связаны по фазам. Затем вы или вызываете фазу ... или просто конкретную цель плагина.

Нужен ли для этого специальный дескриптор сборки?

Ну, так как вам нужно поведение, которое не определены в предопределенных дескрипторах , да. Вам даже понадобятся два из них (для uberjar, один для почтового индекса).

И правда ли, что я не могу вложить его в pom.xml? Таким образом, он идет в src / assembly / something.xml и на него ссылается descriptorRef?

Да, это правда (дескрипторы используют собственный формат), и они обычно входят в src/main/assembly. И нет, descriptorRef для встроенных дескрипторов, вам придется использовать descriptor здесь.

Могу ли я кодировать это как две относительно простые сборки, из которых одна строится на другой (т.е. сборка .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>

Что (как-то) самоочевидно:)

  • включает файлы конфигурации (относительно <directory>) в корне сборки
  • включает в себя uberjar (относительно <directory>) в корне сборки

Наконец, просто запустите mvn assembly:assembly (это цель, предназначенная для использования в CLI).


Я не (сознательно) не включил 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>
...