Maven y agregar JAR al alcance del sistema

86

Tengo un JAR en mi proyecto de Android y quiero que se agregue al APK final. De acuerdo, aquí voy:

    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>android-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
    </dependency>

Pero cuando estoy corriendo mvn package, recibo una advertencia:

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25

Y en el APK final no hay JAR.

¿Cómo arreglo eso?

efpies
fuente
3
No puede usar el alcance del sistema de esta manera. use install: install-file.
bmargulies
@bmargulies ¿Puedes decir para qué es este alcance?
Efectivo el
1
Cambié a gradle y ya no tengo estos dolores de cabeza, excepto que ahora estoy tratando de usar una biblioteca de código abierto con maven y hackear temporalmente un jar (que es tan fácil en gradle y tan difícil en maven).
Dean Hiller
1
Esta pregunta tiene una discusión sobre cómo evitar el uso del alcance del sistema en Maven: stackoverflow.com/questions/3642023/…
Mark Butler
Documentación oficial sobre el 'sistema' de alcance: maven.apache.org/guides/introduction/…
Guillaume Husta

Respuestas:

24

Deberá agregar el jar a su repositorio local de maven. Alternativamente (mejor opción) especifique el repositorio adecuado (si existe) para que pueda ser descargado automáticamente por maven

En cualquier caso, elimine la <systemPath>etiqueta de la dependencia

Atila
fuente
4
He visto ese artículo pero esperaba no hacerlo maven installen todas las computadoras en las que quiero construir ese proyecto (desafortunadamente no encontré este JAR en repositorios). ¡Gracias! :)
efpies
1
Se puede programar como parte de la compilación.
Thorbjørn Ravn Andersen
145

No sé la verdadera razón, pero Maven empuja a los desarrolladores a instalar todas las bibliotecas (también personalizadas) en algunos repositorios de Maven, por scope:systemlo que no es del agrado.maven-install-plugin

seguir el uso:

escribe tu dependencia de esta manera

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

luego, agregue maven-install-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>install-external</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/mylib-core-0.0.1.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.mylib</groupId>
                <artifactId>mylib-core</artifactId>
                <version>0.0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

preste atención phase:clean, para instalar su biblioteca personalizada en su repositorio, debe ejecutar mvn cleany luegomvn install

Ging3r
fuente
10
¿Por qué no usar en <phase>process-resources</phase>lugar de <phase>clean</phase>. La fase de recursos del proceso parece más apropiada para tal escenario y siempre se llama antes de la fase de compilación.
jplandrain
1
en una primera instalación, ¿está seguro de que puede pasar la fase de "validación" que precede a los recursos de proceso en el "ciclo de vida construido"? ; ), 'ciclo de vida limpio' viene primero 'ciclo de vida construido' y no tiene dependencias con ninguna validación, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r
5
Funciona, pero ¿cómo se instalan varias dependencias?
Renaud Pawlak
6
Stackoverflow debería agregar una función que permita a la comunidad anular la elección de OP de la respuesta correcta, porque en mi humilde opinión, ¡esta respuesta debería ser la aceptada! :)
Vijay Chavda
2
Como han comentado otros, la vinculación a la cleanfase es muy engañosa, no forma parte del ciclo de vida predeterminado y distorsiona el significado de clean. Además, el cambio sugerido para usar una fase en el ciclo de vida predeterminado (por ejemplo, validateo process-resources) fallará en una situación de varios módulos, ya que el agregador intenta la resolución de dependencias, antes de que se ejecuten los objetivos personalizados para los módulos secundarios.
lana en plata
14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Prueba esto.

usuario9064925
fuente
11

El alcance del sistema solo se diseñó para tratar con archivos del 'sistema'; archivos que se encuentran en una ubicación fija. Archivos en /usr/lib, o ${java.home}(p tools.jar. Ej .). No fue diseñado para admitir .jararchivos varios en su proyecto.

Los autores se negaron intencionalmente a que las expansiones de nombres de ruta funcionen correctamente para desanimarlo. Como resultado, a corto plazo puede usar install:install-filepara instalar en el repositorio local, y luego algún día usar un administrador de repositorios para compartir.

bmargulies
fuente
3

Utilice un administrador de repositorio e instale este tipo de archivos jar en él. Eso resuelve sus problemas en absoluto y para todas las computadoras en su red.

Khmarbaise
fuente
3
Planeamos ejecutar un repositorio en el servidor local mañana o pasado mañana, pero antes debería resolver este problema de otra manera.
Efectivo el
1
Como mencionó @efpies, esta puede ser una respuesta de pastel en el cielo cuando un desarrollador no tiene permisos / capacidad para crear un administrador de repositorios.
StephenBoesch
En estos días, si tiene la ventana acoplable instalada, todo lo que necesita es docker run -d -p 8081:8081 --name nexus sonatype/nexus3: consulte hub.docker.com/r/sonatype/nexus3 para obtener detalles.
Thorbjørn Ravn Andersen
3

Prueba esta configuración. Funcionó para mí:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>mywebRoot</warSourceDirectory>
        <warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
            WEB-INF\classes\**,build.*
        </warSourceExcludes>
        <webXml>myproject/source/deploiement/web.xml</webXml>
        <webResources>
            <resource>
                <directory>mywebRoot/WEB-INF/lib</directory>
                <targetPath>WEB-INF/lib</targetPath>
                <includes>
                        <include>mySystemJar1.jar.jar</include>
                         <include>mySystemJar2.jar</include>
                   </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>
sofiene zaghdoudi
fuente
0

mvn install: install-file -DgroupId = com.paic.maven -DartifactId = tplconfig-maven-plugin -Dversion = 1.0 -Dpackaging = jar -Dfile = tplconfig-maven-plugin-1.0.jar -DgeneratePom = true

Instale el jar en el repositorio local.

alegremente
fuente
3
Esto es engorroso que agregar directamente a través del pom.
Pradeeban Kathiravelu
0

Gracias a Ging3r obtuve la solución:

sigue estos pasos:

  1. no lo use en la etiqueta de dependencia. Use lo siguiente en la etiqueta de dependencias en el archivo pom.xml:

    <dependency>
    <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
    <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
    <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
        <artifactId>suitetalk-client-v2019_1</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.common</groupId>
        <artifactId>suitetalk-client-common</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. use el siguiente código en la etiqueta de complementos en el archivo pom.xml:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>suitetalk-proxy</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
                        <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
                        <artifactId>suitetalk-client-v2019_1</artifactId>
                        <version>2.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client-common</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.common</groupId>
                        <artifactId>suitetalk-client-common</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

Estoy incluyendo 3 frascos de la carpeta lib:

incluyendo tarro externo en el proyecto de arranque de primavera

Finalmente, use mvn cleany luego mvn installo 'mvn clean install' y simplemente ejecute el archivo jar desde la carpeta de destino o la ruta donde se instala (ver mvn installregistro):

java -jar abc.jar

nota: Recuerde una cosa si está trabajando en jenkins, primero use mvn cleany luego el mvn clean installcomando funcione para usted porque con el código anterior, el mvn clean installcomando almacena el caché para la dependencia.

ankit
fuente