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

标签 java eclipse maven build jar

在我的 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里面的包路径生成的不被尊重(跟编译出来的类不一样)。事实上,如果我尝试将它导入到其他项目中,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>

但是还是不行。清理并安装这两个项目后,我遇到了这个错误

[ERROR] Failed to execute goal on project lory-ejb: Could not resolve dependencies for project lory-ejb-commons:lory-ejb:jar:0.0.1-SNAPSHOT: Could not find artifact lory-ejb-commons:lory-ejb-commons:jar:0.0.1-SNAPSHOT -> [Help 1]

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

The import org.lory.ejb.commons.OperationOutcome cannot be resolved

enter image description here

最佳答案

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

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


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


编辑 打包 pom 的项目在构建时不会生成 jar 文件。这就是您出现错误的原因:Could not find artifact lory-ejb-commons:lory-ejb-commons: jar :0.0.1-SNAPSHOT 。 (那是因为 pom 项目是特殊的,它不打算包含代码;所以你不应该直接在其中包含代码)。

您应该命名您的父项目,例如。 lory-ejb-parent,在其下新建一个名为common的模块,将常用代码放在那里;并让 lory-ejb 模块依赖于 common 模块。

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

关于java - Maven:从一个较大项目的包中创建一个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845738/

相关文章:

eclipse - Kepler 和 Mac OS 的 PyDev 安装问题

java - 使用 Eclipse 升级注释处理器代码 (Java) 时出现问题

java - 为什么我无法从本地存储库导入 Maven jar?

java - 如何在 java 中从 float 转换为 bigDecimal?

Eclipse 插件 - 与文件扩展名和透视图关联的编辑器

java - RX Java Single 未从 Single.merge 返回

java - Maven 和 Java 的 ClassNotFoundException

java - 使用 maven 下载每个 Spring 库

java - SQLite驱动程序: Getting issue with getBinaryStream when Blob is null

java - 结合 @MappedSuperclass 和 @SecondaryTable - 允许吗?