【问题标题】:Copy all dependencies jars from child projects into parent project directory将子项目中的所有依赖项 jar 复制到父项目目录中
【发布时间】:2015-10-27 21:50:16
【问题描述】:

我正在尝试构建一个 Maven 父项目脚本,其中包含一个 3rd 方项目(及其所有依赖项)和我的另外几个项目。

我想将所有依赖项(我的意思是 ALL 依赖项,包括其他依赖项请求的 jars 又由我的一个子项目请求)复制到父项目目录,例如“lib”,这样我就可以使用通配符类路径运行 java:

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

我尝试了使用maven-dependency-plugin 的各种方法,例如copy-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 目录中的两个直接子项目 jar,而不会复制其他任何内容。 我正在考虑进行手动复制(如在 Maven 副本中)以粗暴地从我的子项目的 target/dependency 目录中复制所有 jar,但它看起来......很残酷。

如果用现有的 Maven 软件做不到,我什至可以满足于直接使用 maven exec(我希望它应该自动设置类路径,对吧?)

编辑:我想尽可能少地修改子项目 pom,尤其是第 3 方。

【问题讨论】:

  • "java -cp lib/*.jar" 恐怕这行不通。这个表达式将被解析为“java -cp lib/lib1.jar lib/lib2.jar ...”而不是“java -cp lib/lib1.jar:lib/lib2.jar:...”
  • 抱歉,我已将其修复为不进行 shell 转义。

标签: java maven


【解决方案1】:

如果你想用 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运行它

【讨论】:

  • 谢谢!这具有产生一大堆东西的副作用,例如子项目的文档包等。我可以排除它们或将这个“步骤”移动到安装目标吗?
  • 此外,它不起作用(空罐子,只有一个清单文件)。花了很长时间,如果我现在告诉你,对不起。我猜它不考虑子项目的依赖关系?
  • 我在这里使用它并且它可以工作:github.com/erosb/logika我希望你能弄清楚logika和你的项目之间有什么区别
  • 在您的脚本中,有一个更简单的情况:您的主项目也是具有直接依赖关系的项目。我需要组装所有子模块/子项目的依赖项。
  • 我还有一个更复杂的模块,但不在此组合中。明天我会照顾它
【解决方案2】:

我最终使用了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>

基本上,子模块将它们的依赖 jar 复制到 target/lib 中,然后主项目将这些 jar 复制到自己的 jar 文件夹中。

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

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 2013-06-19
    • 2010-10-30
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多