ti-enxame.com

Ter um jar de terceiros incluído no jar sombreado do Maven sem adicioná-lo ao repositório local

Eu já encontrei uma resposta aqui no Stack Overflow como incluir um JAR de terceiros em um projeto sem instalá-lo em um "repositório local":

Posso adicionar jars ao caminho de classe do maven 2 build sem instalá-los?

Mas, quando eu uso o Maven Shade Plugin para criar um JAR que também inclui todas as dependências do projeto, o JAR de terceiros não é incluído automaticamente.

Como posso fazer com que o Maven Shade Plugin adicione um JAR de terceiros ao JAR sombreado?


De acordo com a resposta obtida, eu fiz funcionar. O que fiz foi adicionar este trecho ao início do meu pom.xml:

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

Em seguida, adicionei uma dependência para o meu projeto, também no pom.xml:

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

E, em seguida, executou uma linha de comando para adicionar um pacote ao '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/

(Não tenho certeza se o caminho do repositório precisa ser um caminho completo, mas não quis arriscar.)

O conteúdo do subdiretório repo é agora:

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

Agora posso verificar isso no controle de versão e não tenho dependências locais ou remotas.

31
Nakedible

Mas, quando eu uso o Maven Shade Plugin para criar um JAR que também inclui todas as dependências do projeto, o JAR de terceiros não é incluído automaticamente.

Sim, porque as dependências com escopo system estão sempre presentes (é exatamente disso que trata o escopo system), para que não sejam incluídas. Na verdade, as pessoas não entendem o que são dependências do escopo system, continuam abusando delas (sim, isso é abuso) e, em seguida, obtêm efeitos colaterais e se perguntam o porquê (como Brian apontou em sua resposta ).

Eu já escrevi muitos , muitos , realmentemuitos vezes sobre isso aqui em SO e em 99% dos casos, system dependências no escopo devem ser evitadas. E repetirei o que o mini-guia - Escopos de Dependência diz mais uma vez:

  • system: Essa dependência é necessária em alguma fase do ciclo de vida do seu projeto, mas é específica do sistema. O uso desse escopo é desencorajado: este é considerado um tipo de recurso "avançado" e deve ser usado apenas quando você realmente entender todas as implicações de seu uso, que podem ser extremamente difíceis se não forem realmente impossível quantificar. Esse escopo, por definição, torna sua compilação não portátil. Pode ser necessário em certos casos do Edge. O escopo do sistema inclui o elemento <systemPath> Que aponta para o local físico dessa dependência na máquina local. Portanto, é usado para se referir a algum artefato que se espera estar presente na máquina local especificada e não em um repositório; e cujo caminho pode variar de máquina para máquina. O elemento systemPath pode se referir a variáveis ​​de ambiente em seu caminho: ${Java_HOME} Por exemplo.

Portanto, em vez de usar o escopo system, ou:

  • Adicione suas bibliotecas ao seu repositório local via install:install-file. Essa é uma maneira rápida e suja de fazer as coisas funcionarem; pode ser uma opção se você estiver sozinho, mas isso torna sua compilação não portátil.
  • Instale e execute um "repositório corporativo" como Nexus, Archiva ou Artifactory e adicione suas bibliotecas via deploy:deploy-file. Este é o cenário ideal .
  • Configure um repositório baseado em arquivo, conforme descrito em esta resposta anterior e coloque suas bibliotecas lá. Este é o melhor compromisso se você não possui um repositório corporativo, mas precisa trabalhar em equipe e não deseja sacrificar a portabilidade.

Por favor, pare de usar o escopo system.

41
Pascal Thivent

O plug-in dos addjars do Maven resolve esse problema - consulte

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

13
Mark Butler

Usei <recursos> para incluir minha lib em todos os jars. ou seja:

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