2012-05-04 11 views
9

Tengo un proyecto de espera para entregar un archivo jar:¿Cómo registrar un archivo jar personalizado creado como un artefacto principal?

<packaging>jar</packaging> 

pero el frasco está construido de una manera personalizada, por lo que el embalaje por defecto hecho con jarra: Tarro ha sido desactivado

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.2</version> 
    <executions> 
    <execution> 
     <id>default-jar</id> 
     <phase>none</phase> 
    </execution> 
    </executions> 
</plugin> 

pero entonces cuando quiero aplicar sombra: sombra en el contenedor existente obtengo un error

El artefacto principal del proyecto no existe.

Supongo que maven no conoce el archivo .jar creado por mi herramienta personalizada. Cómo hacerle saber, porque antrun attachArtifact no funciona

<attachartifact file="./bin/classes.jar" classifier="" type="jar"/> 

el error que consigo es

una hormiga BuildException ha ocurrido: org.apache.maven.artifact.InvalidArtifactRTException: Para artefacto {: jar}: un artefacto adjunto debe tener una ID diferente a su artefacto principal correspondiente.

Este no es el método para registrar el artefacto principal ... ¿Hay alguno (sin escribir el plugin java personalizado)?

Gracias, Lukasz

Respuesta

1

Revisé las fuentes de JarMojo y me dio una idea de cómo resolverlo con Groovy (a través de gmaven)

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>set-main-artifact</id> 
     <phase>package</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes.jar")) 
     </source> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

y funciona! :)

0

Estábamos teniendo el mismo problema, con la obtención del "artefacto conectado debe tener un ID diferente de su correspondiente principal artefacto" error. Hemos encontrado la solución en la siguiente excelente entrada en el blog:

http://devblog.virtage.com/2013/04/embed-and-run-ant-tasks-and-scripts-from-maven/

Como se detalla in this section, se puede solucionar el problema mediante la adición de un clasificador por lo Maven puede distinguir entre el frasco-ant construido y el frasco experta incorporada. Dado que está utilizando antRun attachartifact, que había necesidad de esto:

<attachartifact file="./bin/classes.jar" classifier="foo" type="jar"/> 

Nota También tendrá que incluir ese clasificador (junto con groupId, artifactId y versión) cada vez que desee tomar este frasco como una dependencia en otros proyectos.

1

Algo como esto

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.8</version> 
    <executions> 
     <execution> 
      <id>attach-artifacts</id> 
      <phase>package</phase> 
      <goals> 
       <goal>attach-artifact</goal> 
      </goals> 
      <configuration> 
       <artifacts> 
        <artifact> 
         <file>${basedir}/bin/classes.jar</file> 
         <type>jar</type> 
        </artifact> 
       </artifacts> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
0

Mientras que su solución puede trabajar para una generación a la instalación + fase o donde no hay dependencias en el reactor, en los casos en que sólo se construyen a la fase de compilación o prueba de las clases no envasados no será encontrado por dependencias. Compilar para compilar ocurre cuando se usan complementos como el maven-release-plugin.

Ampliar su solución elegida para incluir la identificación de las clases descomprimidos durante compilación

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>set-main-artifact-compile</id> 
     <phase>compile</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes")) 
     </source> 
     </configuration> 
    </execution> 
    <execution> 
     <id>set-main-artifact</id> 
     <phase>package</phase> 
     <goals> 
     <goal>execute</goal> 
     </goals> 
     <configuration> 
     <source> 
      project.artifact.setFile(new File("./bin/classes.jar")) 
     </source> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Por defecto, el experto-install-plugin se utilice el artefacto identificado a lo largo de las líneas de ${project.build.directory}/${project.finalname}.jar

Así pues, otra opción podría Vaya algo como esto

<build> 
    <directory>bin</directory> 
    <outputDirectory>bin/classes</outputDirectory> 
    <finalName>classes</finalName> 
</build> 
Cuestiones relacionadas