web-dev-qa-db-fra.com

Comment: installer le pot de build Eclipse Maven avec les dépendances

J'utilise Eclipse Maven (m2e) dans Eclipse et j'exécute mon projet comme ceci:

Mon pom.xml Ressemble à ceci:

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ro.project</groupId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>ro.project</name>

    <properties>
        <org.springframework.version>3.1.1.RELEASE</org.springframework.version>
        <org.hibernate.version>4.1.0.Final</org.hibernate.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
    <build>
        <plugins>

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>ro.project.ProjectServer</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>com.Sun</groupId>
                        <artifactId>tools</artifactId>
                        <version>1.7.0_02</version>
                        <scope>system</scope>
                        <systemPath>${Java.home}/../lib/tools.jar</systemPath>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>ant-magic</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <property name="compile_classpath" refid="maven.compile.classpath" />
                                <property name="runtime_classpath" refid="maven.runtime.classpath" />
                                <property name="test_classpath" refid="maven.test.classpath" />
                                <property name="plugin_classpath" refid="maven.plugin.classpath" />

                                <ant antfile="${basedir}/clientExport.xml" target="export-all" />
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <artifactId>project-core</artifactId>
    <url>http://www.project.ro</url>
</project>

Après avoir exécuté l'installation de maven, cela fonctionne ...

Configurations d'exécution Maven:

maven install deploy jar

Le problème est que mon .jar Généré n'a pas les dépendances incluses .... Comment puis-je configurer pom.xml Pour inclure toutes mes dépendances au format .jar Et non déballées .. car il semble que le déballage ne fonctionne pas correctement ...

Pour être sûr que l'inclusion de tous les pots est ok .. J'ai téléchargé et ajouté chaque bibliothèque dans le dossier /lib De jar et le pot fonctionne ... alors .. ma seule question est: comment puis-je configurer pom.xml afin d'ajouter toutes mes dépendances au format jar?

J'ai essayé toutes les méthodes:

  1. Assembly:assembly
  2. Assembly:single
  3. Assembly:single Avec mon descripteur (un fichier assemble.xml) Mais cela ne fonctionnait pas
  4. Plugin maven copy dependencies Mais ne fonctionne toujours pas avec Eclipse Maven - m2e

Je n'ai plus de solutions ... quelqu'un peut-il me dire comment ajouter correctement mes dépendances dans un bocal? Je ne peux pas croire que maven soit si complexe et je ne trouve pas de réponse à ma question partout ..

Merci d'avance

19
Alex

Il y a plusieurs façons de procéder.

1) Si vous voulez un uber-jar (reconditionné avec toutes les dépendances), examinez l'utilisation et la configuration de maven- plugin d'ombre :

  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.group.id.Launcher1</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Cela décompressera toutes les dépendances et les fusionnera en un seul fichier JAR.


2) Si vous souhaitez livrer un bundle (Zip, tar.gz, etc.) avec les fichiers JAR décompressés du bundle ( peut-être sous lib /) alors vous devez regarder dans le maven-Assembly-plugin :

  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <id>create-distro</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>src/main/Assembly/dist.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Notez que cela nécessite un descripteur d'assembly src/main/Assembly/dist.xml et l'exemple ressemble à ceci:

<Assembly xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.0">
  <id>distribution</id>
  <formats>
    <format>Zip</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <useTransitiveDependencies>false</useTransitiveDependencies>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <fileMode>0755</fileMode>
      <directoryMode>0755</directoryMode>
      <outputDirectory>bin</outputDirectory>

      <includes>
        <include>com.group.id:project-launch1</include>
        <include>com.group.id:project-launch2</include>
      </includes>

    </dependencySet>
    <dependencySet>
      <useProjectArtifact>false</useProjectArtifact>
      <useTransitiveDependencies>true</useTransitiveDependencies>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <fileMode>0644</fileMode>
      <directoryMode>0755</directoryMode>
      <outputDirectory>lib</outputDirectory>

      <includes>
        <include>com.group.id:project-lib1</include>
        <include>com.group.id:project-lib2</include>
        <include>com.group.id:project-lib3</include>
        <include>com.group.id:project-lib4</include>
      </includes>

    </dependencySet>
  </dependencySets>
</Assembly>

Et puisque vous assemblez maintenant des dépendances, vous feriez mieux de définir la dépendance dans le pom.xml, comme ceci:

  <dependencies>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-launch1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-launch2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-lib1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    ... and so on ...
  </dependencies>


3) Si vous livrez un ensemble avec un lanceur de fichier JAR exécutable, vous devrez probablement ajouter un = maven-jar-plugin configuration en plus du maven-Assembly-plugin:

  <dependencies>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-lib1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-lib2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.group.id</groupId>
      <artifactId>project-lib3</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>jar</type>
    </dependency>
    ... and so on ...
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
            <compress>true</compress>
            <manifest>
              <mainClass>com.group.id.Launcher1</mainClass>
              <addClasspath>true</addClasspath>
              <classpathPrefix>../lib/</classpathPrefix>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

Notez que la directive "addClasspath" ajoute les dépendances du projet au chemin de classe. Ceci est nécessaire pour les lanceurs JAR, car ils ignorent explicitement toutes les variables d'environnement CLASSPATH.

48
Edwin Buck