2012-04-04 5 views
17

J'utilise Eclipse Maven (M2e) dans Eclipse et je suis en cours d'exécution mon projet comme celui-ci:Comment: Eclipse Maven installer construire pot avec dépendances

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 Je lance le maven installer fonctionne ...

configurations d'exécution Maven:

maven install deploy jar

Le problème est que mon produit .jar il ne possède pas les dépendances inclus .... Comment puis-je configurer pom.xml pour inclure toutes mes dépendances dans le format .jar et non déballés .. car il semble que déballés ne fonctionnent pas correctement

Pour être sûr que tous les jars sont inclus, j'ai téléchargé et ajouté chaque bibliothèque dans le dossier /lib de jar et le fichier jar est en cours d'exécution ... 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 (fichier assemble.xml) mais il ne fonctionnait pas
  4. plug-in maven copy dependencies mais ne fonctionne toujours pas avec Eclipse Maven - m2e

Je suis à court de solutions ... quelqu'un peut-il me dire un moyen approprié d'ajouter mes dépendances dans le pot? Je ne peux pas croire que maven est si complexe et je ne peux pas trouver une réponse à ma question partout ..

Nous vous remercions à l'avance

+1

À moins que vous n'ayez un chargeur de classes à chargement par jar, vous ne pouvez pas imbriquer des jarres comme cela semble être le cas. –

+0

Je vais l'exécuter comme java -jar myjar – Alex

Répondre

46

Il y a deux façons de le faire.

1) Si vous voulez un uber-pot (reconditionnés avec toutes les dépendances), regardez dans l'utilisation et la configuration du maven-shade-plugin:

<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éballer toutes les dépendances et les fusionner en un seul JAR fichier.


2) Si vous voulez livrer un paquet (zip, tar.gz, etc.) avec les fichiers JAR non emballés dans le paquet (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'assemblage src/main/assembly/dist.xml et 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 les dépendances, vous avez mieux 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 paquet avec un exécutable lance fichier JAR, vous aurez probablement besoin d'ajouter une configuration maven-jar-plugin 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 La directive "addClasspath" ajoute les dépendances du projet au chemin de la classe. Ceci est nécessaire pour les lanceurs JAR, car ils ignorent explicitement toutes les variables d'environnement CLASSPATH.

+0

Le fichier jar moyen peut contenir des fichiers jar, mais le chargeur de classe ne charge pas les fichiers jar dans les fichiers jar, il s'agit donc d'un uber-jar ou d'un "package" de fichiers Emplacements. –

+0

je vous remercie pour votre réponse ... Je veux livrer un 'jar' que je peux exécuter avec' java -jar myProject.jar' ... Ce que vous m'avez dit ici n'est pas d'ajouter mes paquets ... comment Je fais ça? merci beaucoup ... Je veux aussi mettre mon 'classpath' dans le pot ... – Alex

+0

maintenant ... il ajoute mes' libs' dans un dossier 'zip' (ou jar) mais mon projet n'est pas là .. le résultat est quelque chose comme: 'project-1.0.SNAPSHOT' (à l'intérieur est seulement un dossier lib) ** et **' META-INF' – Alex

Questions connexes