2010-09-04 6 views
25

Ya encontré una respuesta aquí en Stack Overflow cómo incluir un JAR de terceros en un proyecto sin instalarlo en un "repositorio local":Tener una jarra de terceros incluida en el bote sombreado de Maven sin agregarla al repositorio local

Can I add jars to maven 2 build classpath without installing them?

Pero, cuando uso el plugin de Maven sombra para crear un JAR que incluye todas las dependencias del proyecto, así, la tercera JAR partido no se incluye automáticamente.

¿Cómo puedo hacer que Maven Shade Plugin agregue un JAR de este tipo en el JAR sombreado?


Según la respuesta obtenida, lo hice funcionar. Lo que hice fue, añade este fragmento al principio de mi pom.xml:

<repositories> 
    <repository> 
    <id>repo</id> 
    <url>file://${basedir}/repo</url> 
    </repository> 
</repositories> 

Luego añadió una dependencia para mi proyecto, también para pom.xml:

<dependencies> 
    <dependency> 
    <groupId>dummy</groupId> 
    <artifactId>dummy</artifactId> 
    <version>0.0.0</version> 
    <scope>compile</scope> 
    </dependency> 
</dependencies> 

y luego corrió un comando la línea para añadir un paquete a 'repo':

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file 
    -Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy 
    -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/ 

(. no estoy seguro si la trayectoria de recompra tiene que ser una ruta completa, pero no quería correr riesgos)

El contenido del subdirectorio reporto es ahora:

repo/dummy/dummy/0.0.0/dummy-0.0.0.jar 
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom 
repo/dummy/dummy/maven-metadata-local.xml 

Ahora puede comprobar esto en el control de versiones, y no tienen dependencias locales o remotos.

Respuesta

30

Pero, cuando uso el Maven Shade Plugin para crear un JAR que también incluye todas las dependencias del proyecto, el JAR de terceros no se incluye automáticamente.

Sí, porque las dependencias de ámbito system se supone que estar siempre presente (esto es exactamente lo que el alcance es de aproximadamente system) por lo que no será incluido. La gente en realidad no entiende qué son las dependencias de alcance system, solo siguen abusando de ellas (sí, esto es abuso), y luego obtiene efectos secundarios y se pregunta por qué (como señaló Brian en su answer).

ya había escrito many, many, reallymany tiempos de esto aquí en el PC y en el 99% de los casos, system dependencias de ámbito debe ser evitado. Y voy a repetir lo que el Dependency Scopes mini-guía dice una vez más:

  • system: Se requiere esta dependencia en alguna fase del ciclo de vida del proyecto, pero es específica del sistema. Se desaconseja el uso de este alcance: se considera un tipo de función "avanzada" y solo se debe utilizar cuando se entienden todas las ramificaciones de su uso, que puede ser extremadamente difícil si no imposible de cuantificar. Este alcance, por definición, hace que su compilación no sea portátil. Puede ser necesario en ciertos casos de borde. El alcance del sistema incluye el elemento <systemPath> que apunta a la ubicación física de esta dependencia en la máquina local.Por lo tanto, se usa para referirse a algún artefacto que se espera que esté presente en la máquina local dada y no en un repositorio; y cuya ruta puede variar de máquina a máquina. El elemento systemPath puede hacer referencia a variables de entorno en su ruta: ${JAVA_HOME}, por ejemplo.

Así, en lugar de utilizar el system alcance, ya sea:

  • añaden sus bibliotecas a su repositorio local a través de install:install-file. Esta es una manera rápida y sucia de hacer que las cosas funcionen, podría ser una opción si estás solo pero hace que tu compilación no sea portátil.
  • Instale y ejecute un "repositorio empresarial" como Nexus, Archiva o Artifactory y agregue sus bibliotecas a través del deploy:deploy-file. Este es el escenario Ideal.
  • Configure un repositorio basado en archivos como se describe en this previous answer y coloque sus bibliotecas allí. Este es el mejor compromiso si no tiene un repositorio corporativo pero necesita trabajar en equipo y no quiere sacrificar la portabilidad.

Por favor, deje de usar el alcance system.

+12

El problema no es que la gente * * como utilizar el método equivocado, o lo hacen para la gente Rencor - el problema es que ninguna de estas cosas se documenta con claridad y no hay recetas se dan en Internet para lograr estas cosas Es imposible engatusar a las personas para que creen "repositorios empresariales" o usar maven como lo que significa no tener documentación para los casos comunes que las personas encuentran: siempre encontrarán la manera. – Nakedible

+0

@Nakedible Bueno, supongo que debe tener razón acerca de la documentación de una solución práctica. Con respecto al alcance del 'sistema', tal vez la gente de Maven debería aclarar que no es una solución agregar dependencias "aleatorias" a una compilación. Pero el alcance del 'sistema 'en sí está [documentado] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope). –

+8

Otro problema es que no hay una manera fácil de usar los archivos jar locales: admítelo, el alcance del sistema puede ser incorrecto y hacer que la gente de mente derecha se estremezca, pero los principiantes deben hacer que las cosas funcionen. Tengo un proyecto para mañana, 10⁰⁰, y necesito un recipiente con sombra listo para entonces. tener que configurar un repositorio hace que mis ojos rueden hacia atrás en mi cabeza. –

12

El plug-in de Maven addjars resuelve este problema - ver

http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage

+0

necesita desafortunadamente Maven 3.0.3 –

+0

@Daniel ¿quiere decir que necesita al menos Maven 3.0.3 o que no funciona con las versiones más nuevas? Maven 3.0.3 fue lanzado en 2011-03-04 https://maven.apache.org/docs/history.html ¡si no puede ejecutarlo, tiene serios problemas! En cuanto a addjars no se ha lanzado desde 2012 http://mvnrepository.com/artifact/com.googlecode.addjars-maven-plugin/addjars-maven-plugin –

+0

Me refiero a 3.0.3+. Sí, tengo serias dificultades para usar eclipse índigo, es decir, el conector m2e tiene versiones más bajas y no se puede actualizar. –

1

usados ​​<recursos> incluir mi lib con todos los frascos. es decir:

<build> 
    <resources> 
     <resource> 
      <directory>${project.basedir}</directory> 
      <includes> 
       <include>lib/*.jar</include> 
      </includes> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <createDependencyReducedPom>false</createDependencyReducedPom> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
Cuestiones relacionadas