【问题标题】:Maven: create a jar from a package of a larger projectMaven:从一个较大项目的包中创建一个 jar
【发布时间】:2019-07-17 15:34:32
【问题描述】:

在我的 maven 中,想创建一个 jar,其中包含来自包 org.lory.ejb.commons 的唯一编译类,如您在此处看到的:

因为这些类在 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 不会让我使用它:

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

更新 这是我的共同项目

和 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 编译器仍然会说

import org.lory.ejb.commons.OperationOutcome 不能 解决了

【问题讨论】:

    标签: java eclipse maven build jar


    【解决方案1】:

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

    在 Maven 中实现这一点的主要方法是创建一个父项目(一个带有 pom 包装的 maven 项目);添加一个名为 common 的模块,您将在其中放置公共代码(所有代码来自您的 org.lory.ejb.commons 包);并在您分别放置客户端和服务器代码的位置添加其他client 和server 模块。 client 和 server 模块都将依赖于 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 下的任何内容

    【讨论】:

    • 感谢您的善意建议。恐怕我是以一种非常规的方式来做这件事,因为我以前从未使用过 Maven。在工作中,我们使用 ant+ivy 构建。我开始自己使用 Maven,因为有人建议我学习它。嗯,我在哪里可以找到你在说什么的例子?
    • 在示例中(通过谷歌搜索“github maven 模块示例”,,)在这里github.com/jamesward/maven-multi-module-example。你可以import->import as Maven project到eclipse父项目中;它将检测模块并将它们作为单独的项目导入,等等。
    • 谢谢,我去看看!
    • 你能看看我更新的问题吗?我真的做不出来。
    • @SagittariusA yup
    猜你喜欢
    • 2022-01-16
    • 2020-05-16
    • 2014-04-09
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多