2010-11-22 15 views
8

Sto lavorando a un progetto che utilizzava ant. Avevo un obiettivo dist che fondamentalmente dovrebbe fare jar prima e quindi installare l'applicazione in una directory.Esiste un obiettivo esperto simile a "dist"?

Ciò significa che creerà le directory come bin/, lib/ e config/ nella directory di installazione e quindi copierà i file rilevanti in ciascuna di queste directory.

La mia domanda è duplice:

  1. Esiste un obiettivo Maven che fa questo genere di cose?
  2. In caso contrario, voglio fare maven dist e farlo succedere. Come suggeriresti di farlo usando Maven?
  3. Se non riesco ad avere il mio "target" (come dist), quale sarebbe il modo migliore?

Linea di fondo: io voglio fare tutto questo, ma non voglio per modificare il comportamento degli "obiettivi" di default, come compilazione e pacchetto ecc

Grazie, JRH

PS: sto usando Maven versione 2.2.21

risposta

6

non so che cosa sarebbe andato in config, ma lib e bin è facile.

Per copy all dependencies to a folder solo fare questo:

<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> 

Per riversare il vaso in una cartella bin fare questo (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> 

Ah, ci sono requisiti aggiuntivi:

Bottom line: voglio fare tutto questo, ma non voglio modificare il comportamento dei "target" predefiniti come c Ompile e il pacchetto ecc

In questo caso userei un profilo per attivare questa opzione:

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

Ora si farebbe mvn clean package -Pdist per ottenere la vostra directory dist e se non si aggiunge il profilo, ottieni un comportamento predefinito.

Fondamentalmente, le cose funzionano in modo diverso da come fanno nella formica. Non ci sono obiettivi, ci sono solo fasi del ciclo di vita e obiettivi del plugin.

è possibile eseguire una fase di ciclo di vita, che chiamerà tutti gli obiettivi Maven dei plugin che sono destinate a tutte le fasi fino a questo (ad esempio, se si fa mvn compile, verranno eseguite le seguenti fasi: validate, initialize, generate-sources, process-sources , generate-resources, process-resources, compile). Ma non esiste un modo (facile) per definire una fase del ciclo di vita denominata dist.

Oppure è possibile eseguire un obiettivo plug-in specifico (è possibile eseguire più fasi e/o obiettivi plug-in). Per esempio. potresti scrivere il tuo plugin dist e chiamarlo usando mvn dist:dist, ma non lo consiglierei perché stai usando le funzionalità esistenti e la soluzione del profilo dovrebbe essere una buona idea.

+0

okay, quindi come sarebbe questa azione kick in? Eseguo 'pacchetto mvn'? Voglio fare qualcosa come 'maven dist' e farlo accadere (aggiornato nella domanda) .. è possibile? – jrharshath

+0

+1 hm, utile. Domanda: dovrei fare ciò che voglio fare nel ciclo di vita del pacchetto o nella distribuzione? e perché? – jrharshath

+0

@simpatico Credo che questo dovrebbe essere un commento alla domanda, non alla mia risposta, giusto? –

0

Non si può avere maven dist, con NetBeans (e altri IDE credo) è possibile creare un custom actiondist che esegue come mvn install -Pdist (o mvn clean package -Pdist, come suggerito da Sean).

1

Si potrebbe provare a scrivere un assembly descriptor per il assembly plugin (o cercare google per uno adatto).

Qualcosa di simile

<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> 

creerà una ${project.artifactId}-dist.zip all'interno della vostra directory target. Il file zip verrà disposto come

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

Sembra che il plug-in assemblea solo creare file compressi, essa non solo li copia in una cartella dist.

1

La risposta di Sean è buona e quasi ci sono andata finché non ho scoperto il plug-in del coprocampo http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/.

Vedi qui per un esempio https://github.com/khmarbaise/maven-training/tree/master/502-assembly-plugin

Si chiama come parte del ciclo di vita pacchetto.

<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> 

I descrittori fa riferimento sono abbastanza straigtforward e crea anche un batch e script di shell per voi per eseguire l'applicazione!

Problemi correlati