我的问题是:如何使用Maven一次生成多个可执行Jar文件(包括依赖项),以根据目标操作系统/架构运行SWT应用程序?
我已经创建了一个SWT应用程序,需要在不同的操作系统和架构上运行。该项目是一个包含父POM的Maven多模块项目。 project-pom.xml(打包=pom,指定SWT依赖项) `- application-module(继承SWT依赖项) `- pom.xml(打包=jar) `- domain-specific-module `- pom.xml(打包=jar) `- utils-module(继承SWT依赖项) `- pom.xml(打包=jar)
在父POM(project-pom.xml)中,我已经使用maven配置文件包含了SWT依赖项,以根据我的操作系统和架构进行设置,这很好用:
现在Maven会选择正确的SWT依赖项,例如用于编译应用程序。我使用Maven命令
现在我想为目标平台linux_x86_64/amd64、windows_x86和windows_x86_64生成可执行Jars。首先,我使用maven-jar-plugin生成Jar和清单文件(
如果我运行命令
这是我遇到的第一个问题。下一个问题是,如何一次性创建多个(而不仅仅是单个)可执行的Jar文件,根据我的SWT应用程序的目标操作系统/体系结构(使用类似
我在这个上下文中了解了其他插件(maven-assembly-plugin,maven-shade-plugin),但目前这些插件对我来说都太多信息,无法确定是否会起作用。有没有人能告诉我哪个插件最适合我的目的?
最终完成后,我想使用launch4j-maven-plugin生成本地Windows可执行文件(最终用户不喜欢非本地可执行文件的感觉),并使用先前为Windows生成的可执行Jar文件。
希望这些信息足够了。
我已经创建了一个SWT应用程序,需要在不同的操作系统和架构上运行。该项目是一个包含父POM的Maven多模块项目。 project-pom.xml(打包=pom,指定SWT依赖项) `- application-module(继承SWT依赖项) `- pom.xml(打包=jar) `- domain-specific-module `- pom.xml(打包=jar) `- utils-module(继承SWT依赖项) `- pom.xml(打包=jar)
在父POM(project-pom.xml)中,我已经使用maven配置文件包含了SWT依赖项,以根据我的操作系统和架构进行设置,这很好用:
<dependencies>
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>${swt.artifactId}</artifactId>
<version>4.3</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>EclipseSwtRepository</id>
<url>https://swt-repo.googlecode.com/svn/repo/</url>
</repository>
</repositories>
<profiles>
<profile>
<id>unix-amd64</id>
<activation>
<os>
<family>unix</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<swt.artifactId>org.eclipse.swt.gtk.linux.x86_64</swt.artifactId>
</properties>
</profile>
<profile>
<id>windows-x86</id>
<activation>
<os>
<family>windows</family>
<arch>x86</arch>
</os>
</activation>
<properties>
<swt.artifactId>org.eclipse.swt.win32.win32.x86</swt.artifactId>
</properties>
</profile>
<profile>
<id>windows-x86_64</id>
<activation>
<os>
<family>windows</family>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<swt.artifactId>org.eclipse.swt.win32.win32.x86_64</swt.artifactId>
</properties>
</profile>
</profiles>
现在Maven会选择正确的SWT依赖项,例如用于编译应用程序。我使用Maven命令
mvn help:active-profiles
检查了活动配置文件。现在我想为目标平台linux_x86_64/amd64、windows_x86和windows_x86_64生成可执行Jars。首先,我使用maven-jar-plugin生成Jar和清单文件(
application-module/pom.xml
):<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>qualified.path.to.MyApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
这个很好用。Jar包已经生成,并且清单文件也在里面。正如您所看到的,我的意图是将所有依赖项放在名为lib/
的目录中。但是,该Jar文件无法执行(缺少库文件)。
理论上,下一步是在package
阶段查找依赖项并将其复制到lib/
目录中。对于这一步骤,我(尝试)使用maven-dependency-plugin (application-module/pom.xml
):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
如果我运行命令
mvn package
,没有任何反应(在target/
或其他地方都没有创建目录)。为了检查插件是否正常工作,我使用了命令mvn dependency: copy-dependencies
,它创建了一个名为dependency
的目录(我假设这是此插件的默认值),并将所有依赖的Jar文件放在其中。这是我遇到的第一个问题。下一个问题是,如何一次性创建多个(而不仅仅是单个)可执行的Jar文件,根据我的SWT应用程序的目标操作系统/体系结构(使用类似
mvn package
的单个命令)?生成的构建目录结构应类似于以下内容:
target/ `- linux_x86_64/ `- application-version_linux_x86_64.jar `- libs/ `- org.eclipse.swt.gtk.linux.x86_64-4.3.jar `- ... `- windows_x86/ `- application-version_windows_x86.jar `- libs/ `- org.eclipse.swt.win32.win32.x86-4.3.jar `- ... `- windows_x86_64/ `- application-version_x86_64.jar `- libs/ `- org.eclipse.swt.win32.win32.x86_64-4.3.jar `- ...另一个解决方案是直接将依赖项放在Jar文件中,但目前我还不知道如何做到这一点。
我在这个上下文中了解了其他插件(maven-assembly-plugin,maven-shade-plugin),但目前这些插件对我来说都太多信息,无法确定是否会起作用。有没有人能告诉我哪个插件最适合我的目的?
最终完成后,我想使用launch4j-maven-plugin生成本地Windows可执行文件(最终用户不喜欢非本地可执行文件的感觉),并使用先前为Windows生成的可执行Jar文件。
希望这些信息足够了。