2009-10-05 4 views
7

В моем проекте я создаю много сборок (4-5), и они выводятся в target.1/2 из этих сборок, не берут своих окончательных имен (или идентификатор сборки), но в соответствии с формат artifactID-version.jar. Это очень запутанно. Почему это так?Проблема с созданием сборки

Выдержки из моей pom.xml -

<project xmlns="http://maven.apache.org/POM/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>com.apple</groupId> 
    <artifactId>maven</artifactId> 
    <name>maven_XX</name> 
    <version>0.0.1-SNAPSHOT</version> 


    <build> 
    <plugins> 
    <!-- Added to avoid the compilation issue wrt Annotations --> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.4.2</version> 
     <configuration> 
      <skip>true</skip> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-4</version> 
     <executions>    
      <execution> 
      <id>clientjar</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <finalName>XX_client</finalName> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
       <descriptor> 
        ${basedir}/src/main/resources/assemblies/clientjar.xml 
       </descriptor> 
       </descriptors> 
      </configuration> 
      </execution> 
      <execution> 
      <id>11***</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <finalName>11server</finalName> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
       <descriptor> 
        ${basedir}/src/main/resources/assemblies/11server.xml 
       </descriptor> 
       </descriptors> 
       <outputDirectory>assemblies-target</outputDirectory> 
      </configuration> 
      </execution> 
      <execution> 
      <id>cache</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <finalName>cache</finalName> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
       <descriptor> 
       ${basedir}/src/main/resources/assemblies/cache.xml 
       </descriptor> 
       </descriptors> 
       <outputDirectory>assemblies-target</outputDirectory> 
      </configuration> 
      </execution> 
+0

Его не случайно. Специфические сборки не следуют. Ожидаемый результат для каждого представляет собой банку с предоставленным окончательным именем. Но я получаю их как - Project name-version.jar – user170114

ответ

8

При запуске сборки, вы видите что-то вроде этого вывода на консоль Maven ?:

[INFO] [assembly:single {execution: 11***}] 
[INFO] Reading assembly descriptor: C:\test\test-parent2/src/main/resources/assemblies/11server.xml 
[INFO] Building jar: C:\test\test-parent2\assemblies-target\11server.jar 
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing. 
Instead of attaching the assembly file: C:\test\test-parent2\assemblies-target\11server.jar, it will become the file for 
main project artifact. 
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-de 
terministic! 

Это происходит потому, что все ваши сборки задают <appendAssemblyId>false</appendAssemblyId> и классификатор не указан. Классификатор устарел в версии 2.2-beta-4, поэтому в любом случае игнорируется, это ошибка/функция в плагине.
В результате Maven всегда сделает один из сборок «основным» артефактом для упаковки jar, и вы не увидите его в своем каталоге целевых ассемблеров.

Чтобы обойти это, вы можете указать, что ваш проект имеет упаковку pom, а затем привязывает цели для жизненного цикла банки к помпе.

Чтобы включить process-resources и compile цели, которые вы бы изменить упаковку pom, добавьте следующую конфигурацию в вашем ПОМ, и запустить стандартные задачи на протяжении жизненного цикла. Например, mvn package или mvn install.

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <executions>    
    <execution> 
     <id>process-resources</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>resources</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <executions>    
    <execution> 
     <id>compile</id> 
     <phase>compile</phase> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Полный список целей, связанных с жизненным циклом баночки можно найти в Встроенный Lifecycle Привязки части Introduction to the Build Lifecycle. Все они следуют аналогичной схеме с целями process-resources и compile. В вашем случае вы, вероятно, хотите опустить цель jar.

+0

Привет При запуске сборки я получаю предупреждение, как вы указали. Итак, вы хотите сказать, что я shud использовать цель = компилировать для сборок (что дает банок) и включить цель компиляции maven? – user170114

+0

Нет. Я имею в виду сделать упаковку проекта «pom» и настроить плагины так, чтобы цели, обычно выполняемые в жизненном цикле jar, выполнялись в жизненном цикле pom, при этом конфигурация выше ресурсов и компиляции плагинов будет выполняться в течение жизненного цикла по умолчанию, поэтому вы все еще запускаете 'mvn install'.Это обходит ошибку в сборочном плагине –

+0

Привет .. Я изменил упаковку как «pom». Добавил два плагина, которые вы предоставили, и не вносил никаких изменений в конфигурацию. На запуске mvn install для 2-го сборка, она дает- Вызвано: org.apache.maven.project.DuplicateArtifactAttachmentException: обнаружено дублирующее прикрепление артефакта. – user170114

11

Вытягивание комментария Lyle на уровень вопроса для обеспечения видимости.

Хотя предыдущий ответ работает Lyle указывает, что:

Если я понимаю правильно, это кажется несколько инвазивного обходного для того, что составляет ошибка в сборке плагина. Вместо этого попробуйте установить false в конфигурации. См.: MASSEMBLY-352

Для артефактов, не привязанных к дистрибутиву репозитория, это прекрасное решение и хорошо сработало для меня.

... 
<appendAssemblyId>false</appendAssemblyId> 
<attach>false</attach> 
... 
+2

Прекрасно работает для проекта «одна сборка». –

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