java - Maven 模块组装/阴影构建

标签 java maven jar

我有以下模块结构:

powercontrol
    powercontrol-core
        pom.xml
    powercontrol-data
        pom.xml
    powercontrol-gui
        pom.xml
    powercontrol-ui
        pom.xml
pom.xml

现在我希望客户端可以执行GUI(图形用户界面)和UI(命令行用户界面)。 我尝试在 GUI 和 UI 中使用 Maven Shade 插件,但这确实让事情变得一团糟。

我更喜欢:

  • 包含所有第三方依赖项(log4j 等)的 jar 文件。
  • 包含所有项目模块的 jar 文件(或者可能是 lib 文件夹?)。
  • GUI 和 UI 的执行器。

示例:

powercontrol/
    bin/
        gui
        ui
    lib/
        third-party.jar
        powercontrol-core.jar
        powercontrol-data.jar
        powercontrol-gui.jar
        powercontrol-ui.jar

我现在有点难以获得一个好的结构,我应该从哪里开始?

欢迎所有反馈、建议等。预先感谢您!

更新 2015 年 8 月 28 日

我创建了一个名为:powercontrol-dist 的新模块,它将在 Maven 生命周期中作为最后执行。该模块将生成一个 lib 文件夹,并将 powercontrol-gui 和 powercontrol-cli 中的所有依赖项复制到该文件夹​​中。

现在我有两个问题!

问题1

这是一个好方法吗?或者有更好的办法吗?

powercontrol-dist/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>nl.nberlijn.powercontrol</groupId>
        <artifactId>powercontrol</artifactId>
        <version>1.0</version>
    </parent>
    <artifactId>powercontrol-dist</artifactId>
    <packaging>pom</packaging>
    <name>PowerControl Dist</name>
    <description>Dist</description>
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>powercontrol-gui</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>powercontrol-cli</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

输出:

powercontrol/
    bin/
        gui.exe
        ui.exe
    lib/
        third-party-lib.....jar
        third-party-lib.....jar
        third-party-lib.....jar
        powercontrol-core.jar
        powercontrol-data.jar
        powercontrol-gui.jar
        powercontrol-cli.jar

问题2

此外,我想制作两个引用 powercontrol-gui.jar 和 powercontrol-cli.jar 的 .exe 文件“gui.exe 和 cli.exe”。

在 powercontrol-gui 和 powercontrol-cli 模块的 pom.xml 内的 list 中添加主类是否足够?

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

最佳答案

如果您想要两个可执行 JAR(gui.jar、ui.jar),您应该将阴影插件添加到这两个模块中,以便作为每个模块的一部分构建一个独立的可执行 JAR。这两个 JAR 也将包含所有第三方内容。您无法创建独立的可执行 JAR,其中部分依赖项位于外部 JAR 中(除非您拥有类加载器魔法,或者除非您还必须在命令行上指定外部 JAR)。

如果您无法使用 Maven Shade 插件,您应该告诉我们您到底遇到了什么问题。通常这些都可以解决。一个常见的问题是,创建着色 JAR 时需要“合并”某些文件,特别是 META-INF 中的文件,例如由 Spring 或 Java 服务定位器机制使用。阴影插件提供了对此类合并的支持,但需要针对当前的情况进行配置。

顺便说一句。我建议调用命令行版本“cli.jar” - “ui”听起来像“gui”。

<小时/>

好吧,既然您更新了问题,现在似乎要求“ native 启动器”(exe 文件)而不是可执行 JAR 文件 - 这些是完全不同的东西。

从命令行启动 exe 文件:

C:\> gui

从命令行启动可执行 JAR 文件

C:\ java -jar gui.jar

要获得第一个,您需要创建一个在内部调用 Java 的 native 启动器。可能支持您完成该任务的项目可能是 launch4j - 他们似乎还提供了 Maven 插件。

关于java - Maven 模块组装/阴影构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258805/

相关文章:

java - 在 Spring 中执行 Zuul 代理时出现问题(未找到 bean 类型)

java - 如何从具有多个子模块的 Maven 项目创建单个库 jar?

java - 使用 bndtools 包装从默认包导入的第三方 jar

java - 为什么 .jar 文件中的 .classes 文件的名称看起来很奇怪?

java - Stripe : How do i know whether card is 3d secure and how to charge it

java - hibernate :分组非常慢

java - 我如何完成 Activity 'B' 并返回到 Activity 'A' ?

java - 根据类路径上类的存在来测试代码

maven - cucumber : no backend found when running from Spring Boot jar

maven - Maven中archetype.xml和archetype-metadata.xml有什么区别