Maven instalar y desplegar dependencias de 3 ª parte con línea de comandos simples

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

Pregunta

Tenemos un número de dependencias de terceros que no se alojan en cualquier lugar. Para cada uno de estos tenemos un archivo JAR que nos gustaría ser capaz de instalar y / o implementar en nuestro repositorio. Algunos de los archivos jar tienen sus propias dependencias y también tenemos que declarar estos.

Hemos hecho pom.xml archivos para cada archivo JAR que declarar los GROUPID, artifactId, dependencias, etc. Estos archivos pom.xml todos tienen un pom padre común que declara parte de la información común (por ejemplo <repositories> y <distributionManagement>) .

Me gustaría ser capaz de instalar o implementar estas dependencias con algo tan simple como mvn install y mvn deploy (o tal vez mvn install:install-file y mvn deploy:deploy-file) y tienen todas las propiedades necesarias para estos comandos (artifactId, repositoryId, etc.) será de lectura a partir de los archivos pom.xml.

Para conseguir que esto funcione, al menos para el despliegue, He intentado poner el siguiente en mi pom del padre:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <file>${jarfile}</file>
        <pomFile>pom.xml</pomFile>
        <repositoryId>our-id</repositoryId>
        <url>our-url</url>
      </configuration>
    </plugin>
  </plugins>
</build>

y luego tener cada uno de los poms del niño a definir la propiedad jarfile. Eso permite que corra mvn deploy:deploy-file para desplegar todos los artefactos pom niño. Es de suponer que podría hacer algo similar para obtener mvn install:install-file de trabajo.

Sin embargo, con este enfoque, no soy capaz de liberar el pom padres (que debo hacer ya que los poms del niño dependen de ella), y si trato de mvn release:perform en el pom padres, recibo errores como:

Cannot override read-only parameter: pomFile

Siento que probablemente voy de este por el camino equivocado. Todo lo que realmente quiero hacer es:

  • Poner el código común para todos los tarros de terceros en una matriz compartida pom
  • Escribir un pom mínimo adicional por cada frasco tercer partido
  • Ser capaz de ejecutar algo así como mvn install o mvn deploy sin tener que especificar todos esos complicados propiedades de línea de comandos

¿Cómo puedo lograr eso mejor?

Editar:. dejado más claro que lo ideal sería anterior me gustaría ser capaz de ejecutar algo tan simple como mvn install o mvn deploy y no tener que especificar las propiedades de la línea de comandos

¿Fue útil?

Solución 2

Bueno, he encontrado una solución que me permite ejecutar mvn install justo o mvn deploy y tener el archivo jar instalado en el repositorio local o remoto. Inspirado por un post a la maven-usuarios de la lista y utilizando el acumulación ayudante de plug-in, en el pom padre, tengo:

<pluginManagement>
    <plugins>
        <!-- Attach the jar file to the artifact -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>attach-artifacts</id>
                    <phase>package</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${artifactId}-${version}.jar</file>
                                <type>jar</type>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

Y luego, en los poms del niño, que tengo:

<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Algunas de las piezas de este que inicialmente me tropezar:

  • La ejecución attach-artifact debe estar bajo <pluginManagement> por lo que no se ejecuta si mvn install o mvn deploy el pom padres.
  • Los niños necesitan especificar el build-helper-maven-plugin bajo los plugins de construcción para que el código de la matriz <pluginManagement> se ejecute.
  • Los niños tienen que ser declaradas como tener <packaging>pom</packaging> porque no se puede añadir un frasco a un artefacto si tiene el mismo nombre que el artefacto.

El único inconveniente que veo a este enfoque es que el artefacto se implementa como pom tipo en lugar de tipo jar. Pero no he visto las consecuencias reales de eso.

Otros consejos

Cuando Maven es que falta una dependencia, se le dará un error en ella de salida que contiene la línea de comandos de edición para agregar el frasco a un repositorio remoto. Esa línea de comandos creará automáticamente un POM para usted y cargar los dos juntos. ¿No es suficiente para sus necesidades?

El uso de esta instalación, si sé que tengo una dependencia con ninguna representación repositorio remoto, por lo general sólo tiene que ir adelante y definirlo en mi construcción con el VAB que yo quiero, ejecute la acumulación de una vez, y luego mirar los errores de generación . Copiar el comando para el despliegue, a continuación, ejecutar ese comando. Usted querrá asegurarse de que usted tiene los elementos <repository> configurados correctamente en el POM parental más también establecer elementos <server> correspondiente en su settings.xml con la contraseña de carga repositorio. Aparte de eso, usted debe ser bueno para ir.

Yo añadiría que usted debe comprobar fuera de Nexus antes de llegar a la fecha. Vale la pena la molestia de establecer ahora! : -)

Me encuentro con este problema en mi trabajo:

Ahora tengo una target.jar (tiene una lista de dependencias: a.jar, b.jar, c.jar ...), quiero usar mvn install:install-file para ponerlo en mi repo local, pero cuando corro el golpe de comandos

mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance  -DartifactId=target  -Dversion=1.0.0

pero cuando lo uso he encontrado que hay muchos errores, el tarro de las cuales utilizan target.jar no puede encontrar a.jar, b.jar, c.jar, como por ejemplo:

com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist

Luego fui a ~/.m2/repository/.../target/1.0.0/target.pom para encontrar el archivo pom del objetivo, pero nada en ella!

...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!

Esto es lo que va mal, la install:file -Dfile -DgroupId -D.. no agregar dependencias en POM, que corrige la respuesta por este método

  1. si ya have this maven project source, acaba de instalar en repo locales

    mvn clean install

  2. Si have the jar and the pom of it, instale frasco con pom

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. Si don't have a pom with target jar, una escritura y el uso de comandos superior.

  4. si no se puede recuperar el archivo pom de la misma, puede ser que usted debe darse por vencido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top