Пользовательская сборка maven

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

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

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

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

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

  • Нужен ли для этого собственный дескриптор сборки?
  • И правда ли, что я не могу вложить его в pom.xml ? Так что это идет в src / Assembly / что-то. xml и получает ссылку с помощью descriptorRef ?
  • Можно ли кодировать это как две относительно простые сборки, одна из которых строится на другой (т. е. сборка .Zip использует сборку .Jar) или я должен делать все в одной сборке?
8
задан Pascal Thivent 16 August 2010 в 16:30
поделиться

1 ответ

Я начинаю работать с 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>

Что (как-то) объясняет:)

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

Наконец, просто запустите 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>
27
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: