Maven:从一个较大的项目包中创建一个jar

时间:2019-02-23 20:11:07

标签: java eclipse maven build jar

在我的maven中,您想用包org.lory.ejb.commons中的唯一编译类创建一个jar,如下所示:

enter image description here

因为这些类在ejb核心项目和客户端项目之间是通用的。我正在尝试使用Maven程序集插件,其中我的程序集描述符为:

<assembly>
<id>commons</id>
<formats>
    <format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${basedir}/target/classes/</directory>
        <outputDirectory>${basedir}/target/</outputDirectory>
        <includes>
            <include>org/lory/ejb/commons/**</include>
        </includes>
    </fileSet>
</fileSets>

我pom.xml的一部分是

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.1</version>
    <configuration>
        <descriptors>
            <descriptor>src/assembly/assembly.xml</descriptor>
        </descriptors>
    </configuration>
</plugin>

似乎不尊重jar由其内部的包路径生成(它与所包含的已编译类不同)。实际上,如果我尝试将其导入另一个项目,则Eclipse不允许我使用它:

enter image description here

哪种是正确的使用方式? 谢谢

更新 这是我的共同计划 enter image description here

和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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>lory-ejb-commons</groupId>
<artifactId>lory-ejb-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>lory-ejb-commons</name>
<modules>
    <module>lory-ejb</module>
</modules>

这是另一个项目的pom.xml(从中删除了commons包)

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>lory-ejb-commons</groupId>
    <artifactId>lory-ejb-commons</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>lory-ejb</artifactId>
<name>lory-ejb</name>
<packaging>jar</packaging>

<dependencies>

    <dependency>
        <groupId>lory-ejb-commons</groupId>
        <artifactId>lory-ejb-commons</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

但是它仍然不起作用。清理并安装两个项目后,我都遇到了这个错误

  

[错误]无法在项目lory-ejb上执行目标:无法解析项目lory-ejb-commons的依赖项:lory-ejb:jar:0.0.1-SNAPSHOT:找不到工件lory-ejb-commons: lory-ejb-commons:jar:0.0.1-SNAPSHOT-> [帮助1]

在子项目中,我什至无法将commons包导入为jar,它只是将其视为目录,即使我可以在源代码中导入类,java编译器仍然会说

  

导入org.lory.ejb.commons.OperationOutcome不能为    解决

enter image description here

1 个答案:

答案 0 :(得分:3)

我了解您正在尝试创建一个仅包含部分代码的jar文件(一个模块),但是您使用的是非常规方式。

在Maven中执行此操作的主要方法是创建一个父项目(带有pom包装的maven项目);添加一个名为common的模块,在其中放置通用代码(来自org.lory.ejb.commons包的所有代码);并添加其他clientserver模块,分别在其中放置客户端和服务器代码。 clientserver模块都将依赖于common


顺便说一句,请注意,使用模块也更容易-例如。使用Eclipse,您可以简单地使用pom打包创建一个新的Maven项目。向其中添加Maven模块(带有jar包装);并将代码移至正确的模块


编辑 带有包装pom的项目在生成时不会生成jar文件。这就是为什么出现错误的原因:找不到工件lory-ejb-commons:lory-ejb-commons: jar :0.0.1-SNAPSHOT 。 (这是因为pom项目是特殊项目,它不打算包含代码;因此您不应直接在其中包含代码。)

您应命名您的父项目,例如。 lory-ejb-parent,在其下创建另一个名为common的模块,并将通用代码放在此处;并使lory-ejb模块依赖于common模块。

此外,Eclipse会自动管理基于maven的项目之间的依赖关系,因此无需在project-> Java Build Path下更改任何内容