【问题标题】:Maven pom.xml with more than one jar with versionMaven pom.xml 包含多个版本的 jar
【发布时间】:2015-10-28 12:08:29
【问题描述】:

这是我的 pom.xml

<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>
    <url>http://maven.apache.org</url>

    <name>SomeProject</name>

    <groupId>com.test.te</groupId>
    <artifactId>testjar</artifactId>
    <version>1.1.6</version>
    <packaging>jar</packaging>

    <dependencies>
    ....
    ....
    </dependencies>
    <build>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.conf</include>
                    <include>**/*.java</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
                <executions>
                    <execution>
                        <id>drive</id>
                        <goals><goal>jar</goal></goals>
                            <phase>install</phase>
                            <configuration>
                                <finalName>driver</finalName>
                                <includes>
                                    <include>com/test/te/p1/*.java<include>
                                    <include>com/test/te/p1/*.class</include>
                                </includes>
                            </configuration>
                        </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

这是我的执行方式

mvn clean install

这是构建输出的最后几行。

[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: /home/mycp/workspace/SomeProject/target/testjar-1.1.6.jar
[INFO] [install:install {execution: default-install}]
[INFO] Installing /home/mycp/workspace/SomeProject/target/testjar-1.1.6.jar to /home/mycp/.m2/repository/com/test/te/testjar/1.1.6/testjar-1.1.6.jar
[INFO] [jar:jar {execution: driver}]
[INFO] Building jar: /home/mycp/workspace/TestProject/target/driver.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11 seconds
[INFO] Finished at: Wed Oct 28 17:27:10 IST 2015
[INFO] Final Memory: 129M/888M
[INFO] ------------------------------------------------------------------------
  • 为什么第二个 jar (driver.jar) 没有版本化 (driver-1.1.6.jar)?
  • 为什么本地仓库中没有安装第二个 jar?

如何做到这一点?

我的要求是创建两个罐子 testjar-${project.version}.jar driver-${project.version}.jar 并将这两个安装在两个不同的工件中

/home/mycp/.m2/repository/com/test/te/testjar/${project-version}/testjar-${project.version}.jar强>

/home/mycp/.m2/repository/com/test/te/driver/${project-version}/driver-${project.version}.jar强>

【问题讨论】:

  • 您的 POM 非常错误。您想在这里解决什么问题?
  • 我需要从一个项目中创建两个 jar。两者都应该进行版本控制并推送到本地仓库。
  • 简单地说,从这个项目中我需要创建testjar-1.1.6.jar和driver-1.1.6.jar

标签: maven maven-plugin maven-assembly-plugin maven-jar-plugin


【解决方案1】:

为什么第二个 jar (driver.jar) 没有版本化 (driver-1.1.6.jar)?

那是因为你明确告诉maven-jar-plugin 它的名字应该是driver&lt;finalName&gt;driver&lt;/finalName&gt;。如果要追加版本,则需要进行如下配置:&lt;finalName&gt;driver-${project.version}&lt;/finalName&gt;

为什么本地仓库中没有安装第二个 jar?

那是因为你指定了&lt;phase&gt;install&lt;/phase&gt;的阶段,所以它会在default-install执行之后执行,也就是将artefact安装到本地仓库的执行。相反,您应该将该执行绑定到package 阶段。


这是您应该为maven-jar-plugin 进行的配置。需要一个分类器来创建另一个 jar。

<execution>
  <id>drive</id>
  <goals>
    <goal>jar</goal>
  </goals>
  <phase>package</phase>
  <configuration>
    <finalName>driver-${project.version}</finalName>
    <classifier>classifier</classifier>
    <includes>
      <include>com/test/te/p1/*.java</include>
      <include>com/test/te/p1/*.class</include>
    </includes>
  </configuration>
</execution>

作为旁注,我注意到您还在 POM 中配置了一个 &lt;resources&gt; 元素,包括 Java 和 conf 文件。 你不应该这样。更具体地说:所有资源应放在src/main/resources 下,所有Java 文件应放在src/main/java 下。那么就不需要那个配置了。


根据 cmets,如果您无法添加分类器,则必须删除 maven-jar-plugin 并改用 maven-assembly-plugin。这是一个简单的程序集描述符,可以帮助您入门。将此文件放在src/main/assembly/assembly.xml 下。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>driver</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>true</useProjectArtifact>
            <unpackOptions>
                <includes>
                    <include>com/test/te/p1/*.class</include>
                </includes>
            </unpackOptions>
            <unpack>true</unpack>
        </dependencySet>
    </dependencySets>
</assembly>

在 POM 中使用以下配置:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.5</version>
    <configuration>
        <descriptors>
            <descriptor>src/main/assembly/assembly.xml</descriptor> <!-- point to the location of the assembly.xml file in your project structure -->
        </descriptors>
        <appendAssemblyId>false</appendAssemblyId>
        <finalName>driver-${project.version}</finalName>
    </configuration>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【讨论】:

  • 如果我要删除资源标签,那么如何在 jar 中添加 *.java 文件。
  • @Surendhar .java 文件不应该在 jar 中。只有编译的类去那里。如果要打包应用源,那就另当别论了。
  • 这真的很有帮助。我还有两个问题。一是包层次结构。在驱动程序 jar 中,有一个名为 driver 的文件夹,其中包含 com 文件夹,但我希望 com 文件夹与 META-INF 同级。第二个问题是,它没有将 jar 安装到本地工件。
  • 修复了第一个问题。第二期有什么解决办法吗?
  • @Surendhar 不,如果新 jar 正确安装在本地存储库中而不是在工件中,我认为您应该创建另一个问题来获取所有相关信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 2020-12-11
  • 1970-01-01
  • 2019-10-09
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多