2010-12-22 5 views
6

Quando si utilizza il plug-in di assembly Maven (versione 2.2-beta-5), sembra che il contenitore assemblato conterrà le risorse da una dipendenza anziché dal progetto che si sta assemblando se hanno lo stesso percorso. Nello specifico sto cercando di capire come utilizzare il file di configurazione log4j del progetto piuttosto che uno da un dependecy.Maven Assembly Plugin e risorse

Progetto1

-src

--main

--- risorse

---- log4j.xml

Se Project1 ha una dipendenza - chiamarlo Project2 - che ha anche un file log4j.xml in src/main/resources, quindi dopo aver eseguito il plugin di assemblaggio il jar assemblato contiene il file log4j.xml di Project2 invece di Project1. Credo che questo sia dovuto al fatto che tutte le dipendenze vengono prima scompattate, e quindi quando tenta di decomprimere il progetto di livello superiore il file log4j.xml è già presente e quindi non viene sovrascritto.

Esiste la possibilità che il plug-in di assembly utilizzi i file del progetto anziché quelli della dipendenza?

+0

Questione relativa (simile in effetti) con ulteriori dettagli nella risposta: [Custom maven assembly] (http://stackoverflow.com/q/3493381/320399) – blong

risposta

1

Una possibilità è escludere esplicitamente i file rilevanti dalla creazione dell'assieme.

<dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
      <include>${project.groupId}:Project2</include> 
     </includes> 
     <unpack>true</unpack> 
     <unpackOptions> 
      <excludes> 
       <exclude>**/log4j.xml</exclude> 
      </excludes> 
     </unpackOptions> 
    </dependencySet> 
+1

Questo deve andare nell'assembly, giusto? Non c'è modo di avere solo un file Maven Pom con la cosa giusta. : < – ggb667

3

Qualcosa del genere dovrebbe funzionare:

<assembly> 
    <id>without-log4j-config</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <unpack>true</unpack> 
      <scope>runtime</scope> 
      <unpackOptions> 
       <excludes> 
        <exclude>**/log4j.xml</exclude> 
        <exclude>**/log4j.properties</exclude> 
       </excludes> 
      </unpackOptions> 
     </dependencySet> 
    </dependencySets> 
    <files> 
     <file> 
      <source>pom.xml</source> 
      <outputDirectory>/</outputDirectory> 
     </file> 
    </files> 
    <fileSets> 
     <fileSet> 
      <useDefaultExcludes>false</useDefaultExcludes> 
      <outputDirectory>/</outputDirectory> 
     </fileSet> 
     <fileSet> 
      <directory>src/main/java</directory> 
      <outputDirectory>/</outputDirectory> 
     </fileSet> 
     <fileSet> 
      <directory>src/main/resources</directory> 
      <outputDirectory>/</outputDirectory> 
     </fileSet> 
    </fileSets> 
    <moduleSets> 
     <moduleSet> 
      <includeSubModules>false</includeSubModules> 
      <sources> 
       <outputDirectoryMapping>/</outputDirectoryMapping> 
       <excludeSubModuleDirectories>false</excludeSubModuleDirectories> 
       <fileSets> 
        <fileSet> 
         <directory>src/main/java</directory> 
         <outputDirectory>/</outputDirectory> 
        </fileSet> 
        <fileSet> 
         <directory>src/main/resources</directory> 
         <outputDirectory>/</outputDirectory> 
        </fileSet> 
       </fileSets> 
      </sources> 
      <binaries> 
       <dependencySets> 
        <dependencySet> 
         <unpack>true</unpack> 
        </dependencySet> 
       </dependencySets> 
      </binaries> 
     </moduleSet> 
    </moduleSets> 
</assembly> 

e avrete bisogno questo nel vostro pom:

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <appendAssemblyId>true</appendAssemblyId> 
       <descriptors> 
        <descriptor>src/main/resources/whatever-you-name-the-snippet-above.xml</descriptor> 
       </descriptors> 
      </configuration> 
     </plugin> 

Questa è una parte importante:

<appendAssemblyId>true</appendAssemblyId> 

Senza di esso, se si esegue mvn assembly:assembly l'assemblaggio personalizzato verrà sovrascritto.