我有以下模块结构:
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插件,但这确实让它变得一团糟。
我更喜欢:
示例:的
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
这是一个好方法吗?或者有更好的方法吗?
功率控制 - 距离/ 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
另外我想制作两个.exe文件&#34; gui.exe和cli.exe&#34;参考powercontrol-gui.jar和powercontrol-cli.jar。
在powercontrol-gui和powercontrol-cli模块的pom.xml中添加一个mainclass足够吗?
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
答案 0 :(得分:1)
如果你想要两个可执行的JAR(gui.jar,ui.jar),你应该将shade插件添加到这两个模块中,这样作为每个模块的一部分,就构建了一个独立的可执行JAR。两个JAR都将包含所有第三方内容。您无法创建独立的可执行JAR,其中部分依赖项位于外部JAR中(除非您拥有类加载器魔法,或者除非您还必须在命令行上指定外部JAR)。
如果你坚持使用maven shade插件,你应该告诉我们你究竟遇到了什么问题。通常这些可以解决。一个常见的问题是,当创建带阴影的JAR时,某些文件需要“合并”,特别是META-INF中的文件,例如,由Spring或Java Service Locator机制使用。 shade插件支持这种合并,但需要针对手头的情况进行配置。
顺便说一下。我建议调用命令行版本“cli.jar” - “ui”听起来像“gui”。
好的,既然你更新了你的问题,现在似乎要求一个“本地启动器”(exe文件)而不是一个可执行的JAR文件 - 那些是完全不同的东西。
从命令行启动exe文件:
C:\> gui
从命令行启动可执行JAR文件
C:\ java -jar gui.jar
要获得第一个,您需要创建一个内部调用Java的本机启动器。在该任务中可能支持您的项目可能是launch4j - 它们似乎也提供了Maven插件。