2012-01-04 4 views
23

У меня есть один проект maven, который имеет несколько основных классов. Я хочу создать исполняемые Jars (которые включают в себя alle-зависимости) из этого проекта. Я в настоящее время имеют следующую конфигурацию сборки (с использованием maven.assembly):Создайте несколько запущенных банок (с включенными параметрами) из одного проекта Maven

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

Является ли их способ для того чтобы достигнуть этого с помощью Maven сборки? Если нет, то какой самый простой способ достичь моей цели?

+0

Вы пытались создать несколько '' записей для 'maven-assembly-plugin' с различными конфигурациями? Это вызовет этот плагин дважды и, надеюсь, создаст два JAR-файла ... –

+0

@dma_k Следуя вашему предложению, пытаясь сгенерировать три JAR, первые два будут перезаписаны последней конфигурацией ''. – anon

+0

Попробуйте сыграть с опцией конфигурации '' (проверьте [здесь] (http://maven.apache.org/plugins/maven-assembly-plugin/howto.html)). –

ответ

18

я не смог решить эту проблему с maven-assembly-plugin в удовлетворительным образом, так что я пошел к другому решению. Я использовал onejar-maven-plugin:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

не должно быть разным? Мой maven жалуется, если у меня один и тот же идентификатор более одного раза. –

+0

@AndreHolzner: Да, это была ошибка –

+1

IMHO, то же самое возможно с maven-assembly-plugin. См. Ответы @ donal-fellows – Gabriel

19

Вы можете это сделать. Вам потребуется отдельное исполнение для каждого создаваемого вами артефакта (т. Е. Дать каждому свой собственный идентификатор, но вы можете оставить фазу по умолчанию), и вам нужно будет указать finalName и archive/manifest/mainClass для каждый.

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

Возможно, также должно быть явно указано, что цель «единственного» должна использоваться. –

+3

от этого решения и одного [размещено здесь] (http://stackoverflow.com/a/15799254/288875), похоже, нужно также добавить теги '' и ''? –

+0

Я отредактировал сообщение (ждет экспертной оценки), чтобы включить цели и теги фазы. – Gabriel

1

Чтобы указать немного больше предыдущего ответа, что было очень полезно для меня, вам нужно добавить фазы пакета и сборки цели и запустить MVN запустить чистый пакет, ПОМ выглядит следующим образом:

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

Цель 'assembly' устарела. См. [Информация о плагине] (https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html). Лучше использовать 'single' вместо этого. – Gabriel

6

The top answer работает если вы не используете какие-либо конфигурации (или любой другой ресурс, если на то пошло), который получает в комплект в файл банка (например, конфигурации для Spring Framework авто креплений).

К счастью, это решение также работает с maven-shade-plugin, и у вас нет этой проблемы с onejar-maven-plugin.

Также поддерживается maven-shade-plugin в отличие от onejar-maven-plugin, который находится в чистилище, которое является кодом google.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
Смежные вопросы