【问题标题】:Deploying jars for production in Maven在 Maven 中部署用于生产的 jar
【发布时间】:2012-08-01 07:01:16
【问题描述】:

我的产品中有多个 Java 项目(打包到 jar 中),其中有一个 pom 将它们组合为模块。每个项目都有不同的依赖关系,它们的组合依赖关系在父 pom 中定义。我想为生产准备输出并执行以下操作:

  1. 将我所有的 jar 部署(复制)到一个位置
  2. 将所有项目中的第 3 方 jar 复制到不同的单个文件夹中
  3. 将所有项目中的配置文件(位于 src/main/resources 下)复制到第三个文件夹。

任何人都知道一种无需为所有项目手动复制上述各项的方法吗?我还希望我未来的项目能够支持此部署过程,而不必过于努力和具体。

【问题讨论】:

    标签: java maven deployment dependencies copy


    【解决方案1】:

    为此,您需要使用 Maven 程序集插件 - 这是压缩分发的示例(在生产中您需要然后解压缩):

      <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>${project.basedir}/src/main/assembly/assembly.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    

    和程序集 XML

     <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>${env}</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <includes>
                <include>com.mycompany:ear-project</include>
                <include>com.mycompany:jnlp-project</include>
            </includes>
            <outputDirectory>libs</outputDirectory>
        </dependencySet>
    </dependencySets>
    
    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>target/docbook/pdf</directory>
            <includes>
                <include>index.pdf</include>
            </includes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    

    请注意,对于您的 2 个项目(EAR、JNLP),您可以通过 outputDirectory 配置放置依赖项。

    【讨论】:

    • 我尝试了您的代码模板并获得了一些依赖项。主要问题仍然是资源文件夹。使用“文件集”元素时,我需要指定要复制的确切资源文件夹。我想自动复制项目所有子模块的所有内容,而无需手动指定目录和/或文件名。
    • 是的。抄送。这跟我的问题有什么关系?
    【解决方案2】:

    我的项目有同样的要求。

    将 Jenkins 与 ClearCase 和 SVN 一起使用是有区别的。 如果您使用的是 SVN,您应该将您的项目检出到您的主项目中,并像在同一个目录中一样处理它们。

    查看我的子项目后,我可以处理它们,在示例中,您可以看到 assembly.xml 中的一部分,其中核心和调度程序是子项目。

    </fileSet>
     <fileSet>
      <directory>./core/src/main/resources/</directory>
      <outputDirectory>./examples</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>./scheduler/src/main/resources/</directory>
      <outputDirectory>./examples</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    

    这基本上会将资源文件夹内容复制到主项目示例项目中。

    你可以在这里做同样的事情,如果你所有的项目都在同一个 vob 上并且可用,你应该指定一个相对位置,你要将所有资源复制到该位置。 例如:

    </fileSet>
     <fileSet>
      <directory>../../../your_sub_project1/src/main/resources/</directory>
      <outputDirectory>./examples</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>../../../your_sub_project2/src/main/resources/</directory>
      <outputDirectory>./examples</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    

    这样,在运行主 pom 时,您将能够访问子项目的内容并将资源复制到某个文件夹。 希望对你有帮助..

    【讨论】:

      【解决方案3】:

      除了 Andrey Borisov 的回答之外,我还会总结一下我在汇编 XML 中所做的事情(以回答我所有的问题)。

      1. 将我所有的 jar 部署(复制)到一个位置 [使用“moduleset”元素]
      2. 将所有项目中的第 3 方 jar 复制到不同的 [使用“dependencySets”元素]
      3. 将所有项目中的配置文件(位于 src/main/resources 下)复制到第三个文件夹。 [使用“文件集”元素]

        http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 斌 目录 假的

        <moduleSets>
            <moduleSet>
                <useAllReactorProjects>true</useAllReactorProjects>
                <binaries>
                    <outputDirectory>modules</outputDirectory>
                    <unpack>false</unpack>
                </binaries>
            </moduleSet>
        </moduleSets>
        
        
        <dependencySets>
            <dependencySet>
                <useProjectArtifact>false</useProjectArtifact>
                <outputDirectory>lib</outputDirectory>
            </dependencySet>
        </dependencySets>
        
        <fileSets>
            <fileSet>
                <directory>my DIR 1</directory>
                <excludes>
                    <exclude>*log4j*</exclude>
                </excludes>
                <outputDirectory>resources</outputDirectory>
            </fileSet>
            <fileSet>
                <directory>my DIR 2</directory>
                <outputDirectory>resources</outputDirectory>
            </fileSet>
        </fileSets>
        

      【讨论】:

        猜你喜欢
        • 2017-05-06
        • 2011-06-12
        • 1970-01-01
        • 2020-07-03
        • 2023-02-22
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多