2015-10-14 31 views
1

我正在尝试构建一个包含第三方项目(及其所有依赖项)以及另外几个项目的Maven父项目脚本。将子项目中的所有依赖项jar复制到父项目目录中

我想复制所有的依赖关系(我的意思是ALL依赖性,包括通过其又被我孩子的一个项目所需的其他相关性要求罐)到父项目目录,例如“LIB”,这样我可以运行使用通配符的classpath的Java:

java -cp "lib/*" package.blah.blah.Main 

我使用maven-dependency-plugincopy-dependencies用各种方法尝试了,但我可以指向Maven来是我自己的孩子的项目,而不是他们依赖关系(我的意思是在父项目pom中)。

这是父项目的pom我已经写:

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 

    <properties> 
    <server.version>7.0.2</server.version> 
    <ext.version>1.0-alpha3-SNAPSHOT</ext.version> 
    </properties> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.kontalk</groupId> 
    <artifactId>tigase-kontalk</artifactId> 
    <version>devel</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>../tigase-server/modules/master</module> 
     <module>../tigase-extension</module> 
    </modules> 

    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
      <execution>    
       <id>copy-artifact</id> 
       <phase>package</phase> 
       <goals> 
       <goal>copy</goal> 
       </goals> 
       <configuration> 
       <artifactItems> 
        <artifactItem> 
         <groupId>org.kontalk</groupId> 
         <artifactId>tigase-server</artifactId> 
         <version>${server.version}</version> 
         <type>jar</type> 
        </artifactItem> 
        <artifactItem> 
         <groupId>org.kontalk</groupId> 
         <artifactId>tigase-extension</artifactId> 
         <version>${ext.version}</version> 
         <type>jar</type> 
        </artifactItem> 
       </artifactItems> 
       <outputDirectory>bin</outputDirectory> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.kontalk</groupId> 
      <artifactId>tigase-server</artifactId> 
      <version>${server.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.kontalk</groupId> 
      <artifactId>tigase-extension</artifactId> 
      <version>${ext.version}</version> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 

</project> 

它将在bin目录复制只是两个直接子项目广口瓶,但没有别的。 我正在考虑做一个手动副本(如在Maven副本中)以残忍地复制我的子项目目录中的所有jar,但它看起来......残忍。

如果不能与现有的Maven的软件来完成,我甚至可以安于直接使用maven EXEC

编辑(其中,我希望,会自动设置CLASSPATH吧?):我d喜欢尽可能少地修改儿童项目poms,尤其是第三方项目。

+0

“java -cp lib/*。jar” 恐怕不行。此表达式将解析为“java -cp lib/lib1.jar lib/lib2.jar ...”而不是“java -cp lib/lib1.jar:lib/lib2.jar:...” – erosb

+0

对不起,已经修复它不是壳逃脱。 –

回答

0

我结束了使用copy-dependencies。这是主要的项目POM:

<build> 
     <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.8</version> 
     <executions> 
      <execution> 
       <phase>install</phase> 
       <goals> 
        <goal>copy-dependencies</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.basedir}/jars</outputDirectory> 
       </configuration> 
      </execution> 
     </executions> 
     </plugin> 
     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <id>copy-resources</id> 
        <phase>install</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>jars</outputDirectory> 
         <resources> 
          <resource> 
           <directory>../tigase-extension/target/lib</directory> 
           <excludes> 
            <exclude>junit*</exclude> 
           </excludes> 
          </resource> 
          <resource> 
           <directory>../tigase-server/target/lib</directory> 
           <excludes> 
            <exclude>junit*</exclude> 
           </excludes> 
          </resource> 
          <resource> 
           <directory>../tigase-extension/target</directory> 
           <includes> 
            <include>tigase-extension-*.jar</include> 
           </includes> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 

在我已经加入到同一个插件的代码的子模块:

 <execution> 
     <phase>install</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
     </configuration> 
     </execution> 

基本上,子模块的依赖罐子复制到目标/ lib目录,那么主项目将这些罐子复制到它自己的罐子文件夹中。

它有一些项目特定的文件名和其他硬编码的东西,但我认为这是最好的选择,如果我只想使用Maven提供的工具。一个新的Maven插件可能是最佳的,但我真的没有时间。

0

如果你想用Maven构建一个简单的可运行jar文件,那么你可以使用这个配置:

<profiles> 
     <profile> 
      <id>dist</id> 
      <activation> 
       <activeByDefault>false</activeByDefault> 
      </activation> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-assembly-plugin</artifactId> 
         <configuration> 
          <descriptorRefs> 
           <descriptorRef>jar-with-dependencies</descriptorRef> 
          </descriptorRefs> 
          <finalName>yourJarName</finalName> 
          <appendAssemblyId>false</appendAssemblyId> 
          <archive> 
           <manifest> 
            <mainClass>your.MainClass</mainClass> 
           </manifest> 
          </archive> 
         </configuration> 
         <executions> 
          <execution> 
           <id>dist</id> 
           <phase>package</phase> 
           <goals> 
            <goal>single</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 

那么你可以建立它使用mvn clean package -Pdist

编辑:那么你就可以java -jar target/yourJarName.jar运行

+0

谢谢!这产生了一大堆东西的副作用,如儿童项目的文档包等。我可以排除他们或将此“步骤”移动到安装目标吗? –

+0

此外,它不起作用(空罐子,只有清单文件)。花了很长时间,对不起,如果我刚才告诉你。我想它不考虑子项目的依赖关系? –

+1

我在这里使用它,它的工作原理:https://github.com/erosb/logika 我希望你能弄清楚logika和你的项目有什么区别 – erosb

相关问题