2010-11-22 1 views
8

Я работаю над проектом, который использовал ant. У меня была цель dist, которая в основном сделала бы jar, а затем установила приложение в каталог.Есть ли какая-либо цель maven, подобная «dist»?

Это означает, что в каталоге установки будут созданы каталоги, такие как bin/, lib/ и config/, а затем скопируйте соответствующие файлы в каждый из этих каталогов.

Мой вопрос два раза:

  1. Есть ли Maven цель, которая делает такого рода вещи?
  2. Если нет, я хочу сделать maven dist и сделать это. Как бы вы посоветовали мне это сделать с помощью Maven?
  3. Если у меня не может быть моя собственная «цель» (например, dist), тогда какой был бы лучший способ?

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

Спасибо, JRH

PS: Я использую Maven версии 2.2.21

ответ

6

Я не знаю, что бы в config, но lib и bin легко.

Чтобы copy all dependencies to a folder просто сделать это:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory> 
       ${project.build.directory}/dist/lib 
       </outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Для вывода баночку в папку бин сделать это (reference page):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <finalName>${project.artifactId}</finalName> 
     <outputDirectory>${project.build.directory}/dist/bin</outputDirectory> 
    </configuration> 
</plugin> 

Ах, есть дополнительные требования:

Итог: я хочу сделать все это, но не хочу изменять поведение «целей» по умолчанию, например, c ompile и упаковка и т.д.

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

<profile> 
    <id>dist</profile> 
    <build> 
     <plugins> 
      <!-- insert stuff from above here --> 
     </plugins> 
    </build> 
</profile> 

Теперь вы могли бы сделать mvn clean package -Pdist, чтобы получить каталог Dist, и если вы не добавить профиля, вы получите поведение по умолчанию.

В принципе, все работает по-разному в maven от того, как они делают в муравье. Целей нет, есть только фазы жизненного цикла и цели плагина.

Вы можете либо выполнить фазу жизненного цикла, который будет вызывать все цели Maven плагин, которые привязаны ко всем фазам до этого один (например, если вы mvn compile, будут выполнены следующие этапы: validate, initialize, generate-sources, process-sources , generate-resources, process-resources, compile). Но нет (простого) способа определить фазу жизненного цикла с именем dist.

Или вы можете выполнить определенную цель плагина (вы можете фактически выполнить несколько этапов и/или целей плагина). Например. вы можете написать свой собственный дистрибутив dist и вызвать его с помощью mvn dist:dist, но я бы не рекомендовал этого, потому что вы используете существующую функциональность, а решение профиля должно быть очень хорошим.

+0

в порядке, так как это действие будет срабатывать? Я запускаю 'mvn package'? Я хочу сделать что-то вроде 'maven dist' и сделать это (обновить это в вопросе) .. возможно? – jrharshath

+0

+1 hm, полезно. Вопрос: должен ли я делать то, что я хочу делать в жизненном цикле пакета или в развертывании? и почему? – jrharshath

+0

@simpatico Я думаю, это должен быть комментарий к вопросу, а не мой ответ, правильно? –

0

Вы не можете иметь maven dist, с NetBeans (и других Иды я верю), вы можете создать custom actiondist, который выполняет в mvn install -Pdist (или mvn clean package -Pdist, как это было предложено Sean).

1

Вы можете попробовать написать assembly descriptor для assembly plugin (или найти подходящую для вас поисковик).

Что-то вроде этого

<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation= 
    "http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 
     http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 

    <id>dist</id> 
    <formats><format>zip</format></formats> 

    <fileSets> 
    <fileSet> 
     <directory>src/main/config</directory> 
     <outputDirectory>config</outputDirectory> 
     <useDefaultExcludes>true</useDefaultExcludes> 
    </fileSet> 
    </fileSets> 

    <files> 
    <file> 
     <source>${project.build.directory}/${project.artifactId}.jar</source> 
    </file> 
    </files> 

    <dependencySets> 
    <dependencySet> 
     <useProjectArtifact>false</useProjectArtifact> 
     <outputDirectory>lib</outputDirectory> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

создаст ${project.artifactId}-dist.zip внутри target каталога. Почтовый файл будет выложен как

yourProjectName/ 
yourProjectName/config/... 
yourProjectName/lib/... 
yourProjectName/${project.artifactId}.jar 

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

1

Ответы шпиона хорошо, и я почти пошел на это, пока не узнал о плагине appassembler http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/.

Смотрите здесь для примера https://github.com/khmarbaise/maven-training/tree/master/502-assembly-plugin

Это называется как часть жизненного цикла упаковки.

<build> 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.2</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
    </plugin> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>appassembler-maven-plugin</artifactId> 
    <version>1.1</version> 
    <executions> 
     <execution> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>assemble</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <binPrefix>utility</binPrefix> 
     <assembleDirectory>${project.build.directory}/appassembler</assembleDirectory> 
     <extraJvmArguments>-Xms512m -Xmx1024m</extraJvmArguments> 
     <generateRepository>false</generateRepository> 
     <repositoryName>lib</repositoryName> 
     <repositoryLayout>flat</repositoryLayout> 
     <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> 
     <platforms> 
     <platform>windows</platform> 
     <platform>unix</platform> 
     </platforms> 
     <programs> 
     <program> 
      <mainClass>com.soebes.tools.cli.UtilityCLI</mainClass> 
      <name>utility</name> 
     </program> 
     </programs> 
    </configuration> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <descriptors> 
     <descriptor>src/main/assembly/bin.xml</descriptor> 
     <descriptor>src/main/assembly/bin-unix.xml</descriptor> 
     <descriptor>src/main/assembly/src.xml</descriptor> 
     </descriptors> 
     <tarLongFileMode>gnu</tarLongFileMode> 
    </configuration> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

Дескрипторы это ссылки довольно straigtforward, и это также создает партию и скрипт для вас, чтобы запустить приложение!

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