2009-09-09 6 views
1

В моем проекте используется много сборок, поэтому меня интересуют только сборки. Выполняя установку mvn отдельно от сборок, я получаю стандартную упаковку .jar. Как я могу избежать этого?Maven-2: избегать упаковки по умолчанию?


У меня есть pom.xml, похожий на тот, который вы предоставили. Исполняя МВН установить, я получаю App1.jar, App2.jar, и снимок банка, содержащий все содержимое

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2-beta-2</version> 
      <executions> 
       <execution> 
        <id>assemblyone</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App1</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/report.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
       <execution> 
        <id>assemblytwo</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App2</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/src.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Как я могу избежать этого снимка (не уверен, что точный срок) банку и гарантировать, что только сборки создаются?

ответ

2

Я могу прочитать ваш вопрос двумя способами, я изложил ответы для обоих ниже. Если ни один из них не является верным, можете ли вы изменить свой вопрос с меньшим количеством объяснений, пожалуйста.

1) Вы имеете в виду, что у вас есть проект с упаковкой по умолчанию (jar), и вы хотите избежать создания банки, если не определена сборка? Если это так, то какова цель построения, если не определена сборка?

2) Вы вместо этого имеете в виду, что вы выполняете сборку mvn: сборка для сборки сборки и хотите знать, как получить эту сборку при запуске цели установки?


Для варианта 2, вы можете связать монтажно-плагин к фазе жизненного цикла, чтобы убедиться, что он всегда работает, если вы укажете, что <appendAssemblyId> должно быть ложным, то сборка будет заменить банку по умолчанию.

Например, эта конфигурация будет вызывать плагин сборки на этапе упаковки и заменить банку по умолчанию:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-2</version> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <descriptors> 
      <descriptor>src/main/assembly/archive.xml</descriptor> 
     </descriptors> 
     </configuration> 
    </execution> 
    </executions> 
</plugin>  

Для варианта 1, это на самом деле довольно сложно сделать. Самое лучшее, о чем я могу думать, это указать, что проект имеет pom-упаковку и конфигурирует проект с исполнением, обычно связанным с жизненным циклом jar в profile. Привязки жизненного цикла, которые вам нужно настроить, перечислены в introduction to the build lifecycle

0

Я не уверен, что вы действительно можете сделать это очень простым способом.

Решение состоит в том, чтобы вызвать clean плагин после того, как сборка будет достигнуто, делая это:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-clean-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>auto-clean</id> 
        <phase>package</phase> 
        <goals> 
         <goal>clean</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    ... 
</build> 

Таким образом, JAR, созданный в каталоге target/ будет удален в конце выполнения Maven2.

Однако вам нужно будет определить другой каталог для хранения сборок, созданных Maven2. В противном случае, он будет удален зову clean плагина ... Если вы хотите сохранить их в каталоге assemblies-target/, вы можете добавить, что в pom.xml файле:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <configuration> 
     ... 
     <!-- Copy the ZIP in target/ of the ROOT directory. --> 
     <outputDirectory>assemblies-target</outputDirectory> 
    </configuration> 
    ... 
0

Я думаю, что было бы гораздо больше, ясно, если вы показали нам весь ваш POM и артефакты, которые строятся. Я могу только догадываться, в чем проблема, потому что ваша терминология не то, с чем я знаком.Это мое предположение о проблеме: у вас есть POM, настроенный на создание двух сборочных JAR, но вы получаете третий JAR для самого POM. Другими словами, если ваш артефакт POM является MyApp, вы получаете MyApp-1.0.0.jar или подобное в дополнение к двум JAR, которые вы действительно хотите.

Если это так, проблема сводится к тому, что вы используете Maven для создания нескольких артефактов из одного модуля. Maven предназначен для производства только одного первичного артефакта из каждого модуля. Что бы я сделал, это изменить свой POM, чтобы иметь тип упаковки «pom» и предоставить ему два модуля в разделе <modules> с именем App1 и App2. Создавайте подкаталоги под своим модулем, по одному для каждого приложения. Дайте им каждый POM, настроенный для одной сборки, с типом упаковки «jar». Переместите код/​​файлы/etc. по мере необходимости, в каждый подмодуль, чтобы в родительском модуле не было никаких остатков.

С Maven, если вы обнаруживаете, что создаете два артефакта из одного модуля (которым вы являетесь), вы должны сначала подумать о том, что вы, вероятно, нарушаете лучшие практики Maven и переставляете вещи, чтобы вы производили только один артефакт для каждого модуля.

Пожалуйста, дайте мне знать, если это не имеет смысла, и я попытаюсь уточнить.

+0

Привет Спасибо за вход. Я не думаю, что смогу создать отдельные модули, скажем, App1, App2..bcoz, мои сборные банки, а именно App1.jar, App2.jar имеют общие файлы для включения. Если я укажу пачки как «pom», банку MyApp-1.0.0 не будет создан? – user170114

+0

Ну, эти общие файлы будут помещены в третье место, либо в их собственную сборку, которая распаковывается в каждый модуль, либо (менее чистая) в родительском модуле и ссылается на каждый дочерний объект. Маркировка родительского модуля «pom» не создаст JAR, однако вы все равно будете нарушать принципы Maven, не делая того, что я предлагаю. Поиск на «Maven: The Definitive Guide» - очень хорошая бесплатная книга о Maven. – SingleShot

+0

Спасибо .. Хорошо, я думаю, мне нужно пойти на возможность размещения этих общих пакетов в родительском и доступном от ребенка. В этом случае, где я должен хранить свои дескрипторы сборки под сборками parent/child? Как указать на папки родителя. Я не могу использовать -project.build.outputDirectory правильно? – user170114

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