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

问题描述 投票:1回答:1

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

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内部的包路径生成的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

java eclipse maven build jar
1个回答
3
投票

我知道你正在尝试创建一个只包含代码子集的jar文件(模块) - 但你是以非常规方式进行的。

在Maven中实现这一目标的主要方法是创建一个父项目(一个带有pom包装的maven项目);添加一个名为common的模块,您可以在其中放置公共代码(org.lory.ejb.commons包中的所有代码);并添加其他clientserver模块,分别放置客户端和服务器代码。 clientserver模块都将依赖于common


顺便说一句,请注意使用模块也更容易 - 例如。使用Eclipse,您只需创建一个带有pom包装的新Maven项目;添加maven模块(使用jar packagin);并将代码移动到正确的模块


包装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下更改任何内容

© www.soinside.com 2019 - 2024. All rights reserved.