Maven e adição de JARs ao escopo do sistema

86

Tenho um JAR em meu projeto Android e quero que ele seja adicionado ao APK final. Ok, aqui vou eu:

    <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>

Mas quando estou correndo mvn package, recebo um aviso:

[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

E no APK final não há JARs.

Como faço para corrigir isso?

efpies
fonte
3
Você não pode usar o escopo do sistema dessa maneira. use install: install-file.
bmargulies
@bmargulies Você pode dizer para que serve esse escopo?
efpies de
1
Mudei para o gradle e não tenho mais essas dores de cabeça, exceto agora que estou tentando usar uma biblioteca de código aberto com o maven e hackear temporariamente um jar (o que é tão fácil no gradle e tão difícil no maven).
Dean Hiller
1
Esta questão discute como evitar o uso do escopo do sistema no Maven: stackoverflow.com/questions/3642023/…
Mark Butler
Documentação oficial sobre o 'sistema' de escopo: maven.apache.org/guides/introduction/…
Guillaume Husta

Respostas:

24

Você precisará adicionar o jar ao seu repositório maven local. Alternativamente (melhor opção) especifique o repositório apropriado (se houver) para que possa ser baixado automaticamente pelo maven

Em qualquer caso, remova a <systemPath>tag da dependência

Attila
fonte
4
Eu vi esse artigo, mas não esperava fazê-lo maven installem todos os computadores onde quero construir esse projeto (infelizmente não encontrei este JAR nos repos). Obrigado! :)
efpies
1
Ele pode ser programado como parte da construção.
Thorbjørn Ravn Andersen
141

Não sei o verdadeiro motivo, mas o Maven incentiva os desenvolvedores a instalarem todas as bibliotecas (personalizadas também) em alguns repositórios do maven, portanto, scope:systemnão é muito apreciado. Uma solução simples é usarmaven-install-plugin

siga o uso:

escreva sua dependência desta forma

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

então, adicione 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 atenção phase:clean, para instalar sua biblioteca personalizada em seu repositório, você deve executar mvn cleane entãomvn install

Ging3r
fonte
10
Por que não usar em <phase>process-resources</phase>vez de <phase>clean</phase>. A fase de recursos do processo parece mais apropriada para tal cenário e é sempre chamada antes da fase de compilação.
jplandrain
1
em uma primeira instalação, você tem certeza de que pode passar a fase de 'validação' que vem antes dos recursos de processo no 'ciclo de vida integrado'? ; ), 'ciclo de vida limpo' vem primeiro 'ciclo de vida construído' e não depende de nenhuma validação, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r
5
Funciona, mas como instalar várias dependências?
Renaud Pawlak de
4
O Stackoverflow deve adicionar um recurso que permite à comunidade substituir a escolha da resposta correta do OP, porque IMHO, esta resposta deve ser a aceita! :)
Vijay Chavda
2
Como outros comentaram, vincular a cleanfase é muito enganoso, não faz parte do ciclo de vida padrão e distorce o significado de clean. Além disso, a mudança sugerida para usar uma fase no ciclo de vida padrão (por exemplo, validateou process-resources) irá falhar em uma situação de vários módulos, pois a resolução de dependência é tentada pelo agregador, antes de qualquer meta customizada ser executada para módulos filhos.
lã.in.silver 01 de
12
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Experimente isso.

user9064925
fonte
11

O escopo do sistema foi projetado apenas para lidar com arquivos de 'sistema'; arquivos em algum local fixo. Arquivos em /usr/lib, ou ${java.home}(por exemplo tools.jar). Ele não foi projetado para oferecer suporte a .jararquivos diversos em seu projeto.

Os autores se recusaram intencionalmente a fazer com que as expansões do nome do caminho funcionassem corretamente para desencorajá-lo. Como resultado, em curto prazo, você pode usar install:install-filepara instalar no repo local e, algum dia, usar um gerenciador de repo para compartilhar.

bmargulies
fonte
3

Use um gerenciador de repositório e instale este tipo de jars nele. Isso resolve todos os seus problemas e para todos os computadores da rede.

Khmarbaise
fonte
3
Planejamos executar um repo no servidor local amanhã ou depois de amanhã, mas antes disso, devo resolver o problema de outra maneira.
efpies
1
Como @efpies mencionou, esta pode ser uma resposta difícil quando um desenvolvedor não tem permissão / habilidade para criar um gerenciador de repositório.
javadba
Atualmente, se você instalou o docker, tudo o que você precisa é docker run -d -p 8081:8081 --name nexus sonatype/nexus3- consulte hub.docker.com/r/sonatype/nexus3 para obter detalhes.
Thorbjørn Ravn Andersen
3

Experimente esta configuração. Funcionou para mim:

<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
fonte
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 o jar no repositório local.

alegremente
fonte
3
Isso é mais complicado do que adicionar diretamente pelo pom.
Pradeeban Kathiravelu
0

Graças ao Ging3r, consegui a solução:

Siga esses passos:

  1. não use na tag de dependência. Use a seguinte tag de dependências no arquivo 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 o seguinte código na tag de plug-ins no arquivo 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>

Estou incluindo 3 frascos da pasta lib:

incluindo jar externo no projeto de boot de primavera

Finalmente, use mvn cleanand then mvn installor 'mvn clean install' e apenas execute o arquivo jar da pasta de destino ou do caminho onde instalar (ver mvn installlog):

java -jar abc.jar

nota: lembre-se de uma coisa se você estiver trabalhando no jenkins, primeiro use mvn cleane, em seguida, o mvn clean installcomando funcionará para você, porque com o mvn clean installcache de armazenamento de comando de código anterior para dependência.

ankit
fonte