我有以下模块结构:
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/