2011-02-05 8 views
12

Necesito usar una biblioteca JAR de terceros en mi proyecto (en realidad es Dresden OCL for Eclipse) que no se proporciona como un artefacto Maven. En cambio, es solo un archivo JAR descargable. ¿Puedo indicarle a Maven que use este archivo JAR de la misma manera que estoy usando <dependencies>? ¿Supongo que debería haber algún complemento para este propósito?¿Hay algún complemento que permita cargar/usar dependencias no Maven?

ps. Simplemente no quiero agregar 35Mb de binarios de terceros en mi repositorio SVN.

sería bueno tenerlo configurado de esta manera:

<build> 
    <plugins> 
    <plugin> 
     <groupId>com.example</groupId> 
     <artifactId>non-maven-dependencies-injector</artifactId> 
     <configuration> 
     <libraries> 
      <library>http://www.example.com/something*.jar</library> 
      <library>http://www.example.com/something-else*.jar</library> 
     </libraries> 
     </configuration> 
    </plugin> 
    <plugins> 
</build> 

Y este plugin habría 1) descargar estos archivos JAR, y 2) añadirlos como dependencias en pom.xml. Tal vez este plugin puede almacenarlos en algún lugar de ~/.m2/temp/ ...

Respuesta

4

Sí. Esto (utilizando dependencias no mavenizadas) es compatible con el maven-external-dependency-plugin.

Ejemplo:

<artifactItem> 
    <groupId>jwbroek.cuelib</groupId> 
    <artifactId>cuelib</artifactId> 
    <version>${cuelib-version}</version> 
    <packaging>jar</packaging> 
    <downloadUrl>http://cuelib.googlecode.com/files/cuelib-${cuelib-version}.jar</downloadUrl> 
    <checksum>d03b6b960b3b83a2a419e8b5f07b6ba4bd18387b</checksum> 
</artifactItem> 

También extract artifacts from zip files puede:

<artifactItem> 
    <groupId>mediautil</groupId> 
    <artifactId>mediautil</artifactId> 
    <version>${mediautil-version}</version> 
    <packaging>jar</packaging> 
    <install>true</install> 
    <force>false</force> 
    <downloadUrl>http://downloads.sourceforge.net/project/mediachest/MediaUtil/Version%201.0/mediautil-1.zip</downloadUrl> 
    <checksum>aa7ae51bb24a9268a8e57c6afe478c4293f84fda</checksum> 
    <extractFile>mediautil-${mediautil-version}/mediautil-${mediautil-version}.jar</extractFile> 
    <extractFileChecksum>e843cd55def75dce57123c79b7f36caca4841466</extractFileChecksum> 
</artifactItem> 
+0

¿Cómo conseguirías que esto funcione en Android Studio usando el ejemplo anterior? – zoonosis

12

sí se puede instalarlo en su repositorio local con maven-instalar el plugin

mvn install:install-file -Dfile=your-artifact-1.0.jar \ 
         -DgroupId=org.some.group \ 
         -DartifactId=your-artifact \ 
         -Dversion=1.0 \ 
         -Dpackaging=jar \ 
         -DgeneratePom=true 

Si desea que los otros miembros del equipo para poder descargar Dependencia sin tener que instalarlos thelves, necesita configurar su propio repositorio de artefactos y desplegar el artefacto allí con maven-deploy-plugin de la misma forma que lo instaló localy.

+0

grande, yo no sabía nada de generatePom = true hasta ahora. Esto le ahorra el mensaje de información que maven no pudo encontrar el pom. – Boris

+0

@Boris, así que no dude en votar por mi respuesta – lweller

+0

Tiene razón. Hecho. – Boris

0

Puede instalarlo localmente o implementarlo en su repositorio local del sitio (por ejemplo, en toda la empresa). Si utiliza un experto en la dependencia no puede encontrar en los repositorios configurados, que incluso le da los comandos necesarios:

Entonces, instalarlo con el comando: mvn instalar: instalar archivos -DgroupId = mygid -DartifactId = myaid -Dversion = 1.0 -Dpackaging = frasco -dfile =/ruta/a/archivo

Alternativamente, si usted aloja su propio repositorio puede implementar el archivo existe: mvn despliegue: desplegar-file = -DgroupId mygid -DartifactId = myaid -Dversion = 1.0 -Dpackaging = jar -Dfile =/ruta/a/archivo -Durl = [url] -DrepositoryId = [id]

Tenga en cuenta: De esta manera solo agrega el .jar a su repositorio, no habrá pom junto con él para especificar dependencias transitorias. Por lo tanto, si su biblioteca de terceros tiene dependencias propias, deberá agregarlas manualmente a su pom.xml, ya que no habrá una resolución automática.

+0

BTW: Eso podría haber sido encontrado por una búsqueda en Internet para "tercera parte". – Boris

2

Puede usar "sistema" -scope en su pom.xml para las dependencias de bibliotecas locales:

sistema
Este ámbito es similar al proporcionado excepto que usted tiene que proporcionar al JAR que lo contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio .

systemPath
se usa solo si el ámbito de dependencia es el sistema. De lo contrario, la compilación fallará si se establece este elemento. La ruta debe ser absoluta, por lo que se recomienda utilizar una propiedad para especificar la ruta específica de la máquina (más en las propiedades a continuación), como $ {java.home}/lib. Como se supone que las dependencias del alcance del sistema se instalan a priori, Maven no verificará los repositorios para el proyecto, sino que verificará para asegurarse de que el archivo exista. De lo contrario, Maven suspenderá la compilación y le sugerirá que la descargue e instale de forma manual.

<dependency> 
    <groupId>some.id</groupId> 
    <artifactId>artifact</artifactId> 
    <version>1.2.3</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/path/to/jarFile.jar</systemPath> 
</dependency> 

yo sepa, se puede usar más o menos lo que quiere para groupId, artifactId y la versión. Ver Maven System Depencies y this pregunta.

+0

donde debe ubicarse el archivo 'jarFile.jar'? ¿Quién debería colocarlo allí? Pago un proyecto desde SVN y ejecuto el paquete 'mvn'. ¿De dónde vendrá este archivo? – yegor256

+0

$ {basedir} en < systemPath> apunta a la raíz del proyecto (donde está el pom.xml). No estoy 100% seguro de esto, pero probablemente deba colocar los archivos en una "carpeta de origen" (como en src/main/resources) para que los recoja el 'paquete mvn'. Utilicé esto una vez, tal vez hace seis meses, así que los detalles ya están borrosos. Funcionó, sin embargo, pero luego decidimos usar la ruta 'mvn install' para insertar nuestras bibliotecas en los repositorios locales, por lo que no necesitábamos copiar nuevas versiones de la biblioteca al otro proyecto todo el tiempo. – esaj

0

"mvn install: install-file" mencionado aquí le ayudará a instalar los archivos jar en su repositorio local. Sin embargo, si desea que estos tarros estén disponibles posteriormente para los desarrolladores en el proyecto automáticamente, copie las piezas relevantes en un repositorio disponible para todos en el proyecto y haga que este repositorio esté disponible utilizando la etiqueta, por ejemplo, verificando todos los archivos en el proyecto. SVN. Ver http://code.google.com/p/codebistro/wiki/BuildNumber#Maven_Plugin_Example que se refiere a un repositorio alojado SVN, por ejemplo.

P.S. ¡Que tengas un buen viaje al SV!

+0

Me alegra verte aquí :) El procedimiento de "copiar las piezas relevantes en un repositorio disponible para todos" lo hace quién? ¿Está automatizado de alguna manera? Como dije en la pregunta, hay más de 30 archivos en la biblioteca que voy a usar. Debería copiarlos todos manualmente? ¿Y qué sucede cuando se actualizan? ¿Quién los copiará de nuevo? :) Eche un vistazo a (dependency-copy) (http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html), "copia una lista de artefactos del repositorio en ubicaciones definidas ". Necesito exactamente lo contrario:" de las ubicaciones al repositorio "... – yegor256

+0

@Yegor Solía ​​tener un script con un montón de mvn install: install-file que revisa todos los artefactos externos y los coloca. Puedes especifique -DlocalRepositoryPath = para instalarlo directamente en su repositorio. Francamente, no veo una forma de automatizarlo más. –

2

Tomando en cuenta su ejemplo Dresden OCL tiene más de 20 archivos JAR, y necesita distribuirlo a muchos desarrolladores, la mejor solución sería instalar un administrador de repositorios en alguna parte (como nexus o artifactory), tómese su tiempo para subir estos 20 jarras a ese repositorio, y úsalas. La mejor opción sería ponerlos en un ID de grupo privado, así que si se publicarán en algún momento en un repositorio de m2, no terminará con conflictos de nombres.

Otro punto sería pedirle a los Mantenedores OCL de Dresde si pueden ofrecer un repositorio m2. Ahora que m2eclipse es un proyecto de incubadora de eclipse, esto podría interesar a más personas.

0

Aquí hay un enfoque diferente que permitirá agregar un repositorio Maven dentro del directorio del proyecto, usarlo como un depósito en usted pom.xml, y compartir el repositorio en SVN con cualquier persona que revise el proyecto. Crosspost from here.

En su directorio de proyecto, cree una carpeta llamada repo, que usaremos como un repositorio de Maven basado en carpetas.

Añadir el siguiente repositorio de archivos a su proyecto pom.xml:

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

desplegar el frasco externa (s) en el repositorio de archivos con el comando siguiente:

mvn deploy:deploy-file 
-Durl=file:///absolute/path/to/your-project/repo \ 
-DrepositoryId=file.repo \ 
-Dfile=path-to-your.jar \ 
-DgroupId=some.external.project.group \ 
-DartifactId=the-artifact-name \ 
-Dversion=1.0 \ 
-Dpackaging=jar; 

Después de esto sólo se puede añadir una dependencia normal del contenedor en su proyecto pom.xml, utilizando los valores para groupId, artifactId y la versión que aprobó anteriormente. A continuación, puede agregar la carpeta repo a SVN y confirmar los cambios en su pom.xml. Cualquier desarrollador que verifique su proyecto ahora podrá usar la misma dependencia sin ningún esfuerzo.

+0

"empaque sus clases como un contenedor y despliéguelos" - ¿quién lo va a hacer? ¿Cambié la plataforma de integración/construcción? – yegor256

+0

@ yegor256: Vaya, disculpe, fue un error de copiar y pegar al publicar la misma solución en dos preguntas diferentes. (Consulte mi edición anterior) En su caso, simplemente implemente el archivo externo al archivo repositorio con el mismo comando. No es necesario alterar ni empaquetar ninguno de sus propio código! – Tim

+0

El mismo problema: necesito "implementar los contenedores" manualmente. Estoy tratando de encontrar un mecanismo totalmente automatizado, que descargue, implemente, instale y haga que los tarros estén disponibles para la construcción maven. – yegor256

0
I think the below answer will help you...just place jar files on your SVN and tell them all to e synch with SVN and here the ${lib.directory} will be t he local path 

<plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-install-plugin</artifactId> 
        <version>2.4</version> 
        <executions> 
         <execution> 
          <id>db2jcc9</id> 
          <phase>compile</phase> 
          <goals> 
           <goal>install-file</goal> 
          </goals> 
          <configuration> 
           <groupId>com.ibm</groupId> 
           <artifactId>db2jcc</artifactId> 
           <version>9</version> 
           <packaging>jar</packaging> 
           <file>${lib.directory}\db2jcc-9.jar</file> 
          </configuration> 
         </execution> 
         </executions> 
    <plugin> 
Cuestiones relacionadas