2017-01-16 4 views
1

У меня многомодовый pom, и я хочу собрать jar-with-dependencies для родителя. Но мне не нужно создавать сборку для каждого модуля, у них нет событий с дескрипторами сборки. Поэтому я использую параметр runOnlyAtExecutionRoot из Maven-сборка-плагина с ограниченным успехом:Использование runOnlyAtExecutionRoot внутри pom

  1. Если я ввожу параметр через командную строку, она работает: скачет монтаж модулей и сборки родительского проекта генерируются: mvn compile assembly:single -DrunOnlyAtExecutionRoot=true
  2. это я ввести параметр в родительский POM, он игнорируется: mvn compile assembly:single В pom.xml:

    <?xml version="1.0" encoding="UTF-8"?> 
    <project xmlns="http://maven.apache.orgPOM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
        <modelVersion>4.0.0</modelVersion> 
        <groupId>my.company</groupId> 
        <artifactId>thisApp</artifactId> 
        <version>0.0.1-SNAPSHOT</version> 
        <packaging>pom</packaging> 
        <name>thisApp Parent Project</name> 
    
        <modules> 
         <module>my.company.thisApp.main</module> 
         <module>my.company.library-1</module> 
         <module>my.company.library-1.library-1-1</module> 
         <module>my.company.library-1.library-1-2</module> 
         <module>my.company.library-2</module> 
         <module>my.company.library-3</module> 
         <module>my.company.library-3.library-3-1</module> 
        </modules> 
    
        <build> 
         <pluginManagement> 
          <plugins> 
           <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <configuration> 
             <source>1.8</source> 
             <target>1.8</target> 
            </configuration> 
           </plugin> 
           <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-assembly-plugin</artifactId> 
            <version>3.0.0</version> 
            <configuration> 
             <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot> 
             <descriptorRefs> 
              <descriptorRef>jar-with-dependencies</descriptorRef> 
             </descriptorRefs> 
            </configuration> 
           </plugin> 
          </plugins> 
         </pluginManagement> 
        </build> 
        <dependencies> 
         <dependency> 
          <groupId>my.company.thisApp</groupId> 
          <artifactId>main</artifactId> 
          <version>0.0.1-SNAPSHOT</version> 
         </dependency> 
        </dependencies> 
    </project> 
    

Второй способ не работает, он пытается собрать каждый из модулей, и он терпит неудачу, потому что «для них не найдены дескрипторы сборки».

Каков правильный способ указать параметр runOnlyAtExecutionRoot в POM? Я также попытался превратить его в «исполнение» без успеха.

ответ

1

Он не работает, потому что ссылка на дескриптор «jar-with-dependencies» не может быть собрана для проекта с упаковкой POM (как родительский проект). При работе:

mvn clean package assembly:single 

Я получил следующее сообщение об ошибке:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:3.0.0:single (default-cli) on project my-parent: Failed to create assembly: Error creating assembly archive jar-with-dependencies: You must set at least one file. 

Он говорит, что должно быть по крайней мере один файл, то есть, по крайней мере на файл должен быть добавлен к сборке. Поскольку нет упакованной банки, это невозможно.

Раствор является использованием дескриптора сборки в родительском П, который добавляет упакованные банки и библиотеку модулей банков (см copy-dependencies) или убер банку (см shade).

Пример: создать файл дескриптора в родительском проекте под управлением src/main/assembly/и указать его в разделе «дескрипторы» в конфигурации плагина. Мой дескриптор называется «мой-descriptor.xml»

<configuration> 
    <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot> 
    <descriptors> 
    <descriptor>${project.basedir}/src/main/assembly/my-descriptor.xml</descriptor> 
    </descriptors> 
</configuration> 

Дескриптор добавляет желает файлы на распределение архива. Мой дескриптор поднимает упакованную баночку модуля «мой-сервис» и выглядит следующим образом:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> 
    <id>distribution</id> 
    <formats> 
    <format>zip</format> 
    </formats> 

    <files> 
    <file> 
     <source>my-service/target/my-service-${project.version}.jar</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    </files> 
</assembly> 
+0

Вы правы, когда ваши говорят, что проект с упаковкой П не имеет файла, чтобы добавить к сборке, но тот факт, исчезает, как только вы заявляете зависимость от любого из его модулей: тогда он должен добавить, по крайней мере, файлы этого модуля, поэтому ошибка «Вы должны установить хотя бы один файл» исчезает. Я изменил вопрос, чтобы показать полный pom. –

+0

Ссылка на дескриптор «jar-with-dependencies» работает для вас, когда вы добавляете зависимость? – gclaussn

+0

Да, ссылка дескриптора «jar-with-dependencies» работает для родительского помпа, когда ему есть что добавить (зависимость в этом случае). Проблема заключается в параметре runOnlyAtExecutionRoot, который выполняется только при вводе через командную строку. –

 Смежные вопросы

  • Нет связанных вопросов^_^