用于创建临时 zip 工件的 Maven 最佳实践

Posted

技术标签:

【中文标题】用于创建临时 zip 工件的 Maven 最佳实践【英文标题】:Maven best practice for creating ad hoc zip artifact 【发布时间】:2011-12-11 20:57:56 【问题描述】:

假设我需要管理一个工件,该工件由一个压缩为 zip 存档的任意文件夹/文件结构组成。我不清楚如何在 Maven 中以最适合“Maven 方式”的方式完成此任务。

我知道没有“zip”包装类型。这是否意味着 Maven 中没有通用生命周期来简单地获取资源文件夹中的内容,将其压缩并将其安装/部署到我的存储库?

我正在寻找选项,评估每个选项如何满足我遵循 maven 方式的要求,因为我不希望受到偏离黄金路径的明显惩罚。 . .

【问题讨论】:

可以在没有classifier 的情况下完成:***.com/questions/25078028/… 【参考方案1】:

在您的maven 项目中创建一个文件夹assembly。 在程序集文件夹中添加zip.xml 文件。 在zip.xml 中添加以下代码,将项目内容打包到zip

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>zip</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>directoryName of your project</directory>
        <outputDirectory>/</outputDirectory>
    </fileSet>
</fileSets>

【讨论】:

【参考方案2】:

决定你将为zip 文件使用什么分类器,为了争论,假设它是sample

在您的项目中创建文件assembly/sample.xml

assembly/sample.xml 中填写如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<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>sample</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <outputDirectory>/</outputDirectory>
      <directory>some/directory/in/your/project</directory>
    </fileSet>
  </fileSets>
  <!-- use this section if you want to package dependencies -->
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <excludes>
        <exclude>*:pom</exclude>
      </excludes>
      <useStrictFiltering>true</useStrictFiltering>
      <useProjectArtifact>false</useProjectArtifact>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

将此添加到您的 pom 的 build 部分

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>create-distribution</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>assembly/sample.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

因此它应该创建并安装you-project-name-VERSION-sample.zip

我建议你阅读 Sonatype 的 maven 书中关于程序集的章节: https://books.sonatype.com/mvnref-book/reference/assemblies.html

另外,请阅读汇编格式规范:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

【讨论】:

但是什么包装类型最适合在 pom 中使用?或者即使没有 Java 源代码,您也应该只使用默认 (java)。 @William。如果没有与项目关联的 Java 代码,请使用 pom【参考方案3】:

在 assembly/sample.xml 中填写如下内容:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>install</id>
  <baseDirectory>/</baseDirectory>
  <formats>
  <format>zip</format>
</formats>
<fileSets>
  <fileSet>
    <includes>
      <include>README*</include>
      <include>*.sh</include>
    </includes>
  </fileSet>
  <fileSet>
    <directory>target/classes/</directory>
    <outputDirectory>resources</outputDirectory>
    <includes>
      <include>*.properties</include>
       <include>*.xml</include>
    </includes>
    <lineEnding>dos</lineEnding>
  </fileSet>
  <!-- 
  <fileSet>
    <directory>target/</directory>
    <outputDirectory>lib</outputDirectory>
    <includes>
      <include>*.jar</include>
    </includes>
    <lineEnding>dos</lineEnding>
  </fileSet>
   -->
</fileSets>
 <!-- use this section if you want to package dependencies -->
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <excludes>
        <exclude>*:pom</exclude>
      </excludes>
      <useStrictFiltering>true</useStrictFiltering>
      <useProjectArtifact>true</useProjectArtifact>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

在 pom.xml 文件中添加以下代码。

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptor>assembly/sample.xml</descriptor>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

mvn package -P dev -Dmaven.test.skip 运行命令

将创建包含以下内容的 zip 文件: xxxx.zip -lib/.jar -resources/.xml/properties -自述文件 -start.sh

【讨论】:

已回答问题。您没有携带任何额外信息。

以上是关于用于创建临时 zip 工件的 Maven 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

使用 CI/Hudson 支持为多个环境 [prod、test、dev] 生成工件的 Maven 最佳实践?

从现有 jar 创建 maven 工件的最佳方法

Maven安装最佳实践(Windows平台)

Maven2:企业项目的最佳实践(EAR 文件)

使用已发布的工件时,Maven 依赖项解析如何工作?

Maven工件和组命名约定[重复]