Maven模块组装/遮阳构造

时间:2015-08-27 20:25:56

标签: 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

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

功率控制 - 距离/ 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>

1 个答案:

答案 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插件。