使用maven为SWT应用程序构建多平台可执行文件
我的问题是:如何使用maven根据目标操作系统/体系结构为SWT应用程序生成多个可执行Jar文件(包括依赖项)?
我创建了一个SWT应用程序,它必须在不同的操作系统和体系结构上运行。 该项目是一个Maven多模块项目,包括父POM。
project-pom.xml(packaging = pom,指定SWT依赖项)` - application-module(inheritanceSWT依赖项)` - pom.xml(packaging = jar)` - domain-specific-module` - pom.xml(packaging = jar )` - utils-module(inheritanceSWT依赖项)` - pom.xml(packaging = jar)
在父POM( project-pom.xml
)中,我根据我的操作系统和架构使用maven配置文件包含了SWT依赖项,工作正常:
org.eclipse.swt ${swt.artifactId} 4.3 EclipseSwtRepository https://swt-repo.googlecode.com/svn/repo/ unix-amd64 unix amd64 org.eclipse.swt.gtk.linux.x86_64 windows-x86 windows x86 org.eclipse.swt.win32.win32.x86 windows-x86_64 windows x86_64 org.eclipse.swt.win32.win32.x86_64
现在maven选择正确的SWT依赖关系,例如用于编译应用程序。 我使用maven命令mvn help:active-profiles
检查了活动配置mvn help:active-profiles
。
现在我想为目标平台linux_x86_64 / amd64,windows_x86和windows_x86_64生成可执行文件Jars。 在第一步中,我使用maven-jar-plugin生成Jar和清单文件( application-module/pom.xml
):
org.apache.maven.plugins maven-jar-plugin 2.4 true libs/ qualified.path.to.MyApplication
这很好用。 生成Jar并且清单在其中。 如您所见,我的目的是将所有依赖项放在名为lib/
的目录中。 但Jar文件不可执行(缺少库)。
下一步(理论上)是在package
阶段找到依赖关系并在lib/
目录中复制它们。 对于这一步,我(试图)使用maven-dependency-plugin( application-module/pom.xml
):
org.apache.maven.plugins maven-dependency-plugin 2.8 copy-dependencies package copy-dependencies ${project.build.directory}/libs false false true
如果我运行命令mvn package
没有任何反应( target/
或其他地方没有创建目录)。 要检查插件是否正常工作,我使用了命令mvn dependency:copy-dependencies
,它创建了一个名为dependency
的目录(我假设这个插件的默认值)并将所有相关的Jar文件放在那里。
这是我遇到的第一个问题。 接下来的问题是,如何根据我的SWT应用程序的目标操作系统/体系结构一次创建多个(不仅是单个)可执行Jar文件(使用像mvn package
这样的单个命令)? 生成目录的结果结构应类似于:
目标/ ` - 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可执行文件(最终用户不喜欢非本机可执行文件的感觉),使用之前生成的可执行jar文件for windows。
我希望这些是足够的信息。
我通过研究JackRabbit的设置使用Maven完成了这项工作。 JackRabbit以各种forms(独立,OSGi捆绑,webapp等)提供,它们都是从一个聚合器pom完成的。
第一步是将父pom与配置文件pom中的配置文件和公共依赖项分开,聚合器pom定义项目子模块的(顺序)。 聚合器pom中的第一个子模块通常是父pom。 聚合器pom的优点是你可以使用聚合器pom运行Maven,一次为你的项目构建一切。
接下来,我创建了一个“通用程序集资源”项目,该项目生成一个包含所有资源(例如自述文件,手册,图片等)的jar,这些资源在平台的所有程序集中使用。 每个平台assembly项目都会提取此jar,然后将提取的文件复制到适当的位置。 就我所见,JackRabbit不会这样做,所以你可以跳过这一步。
最后,为每个平台创建一个单独的平台组装子模块。 在平台程序集中,您可以设置您想要和不想要的依赖项。 子模块可以包含特定于平台的文件(例如,Windows的批处理文件,Linux的.sh文件)。 组装表单可以特定于平台(例如,用于Windows的.zip和用于Linux的.tar.gz)。 对于Windows,我还包括NSIS来创建一个setup.exe(你也可以在安装了NSIS-package的Linux上构建它)。
我在这个设置中使用了maven-dependency-plugin,它有不同的阶段。 我经常使用的是阶段process-resources
,您可以尝试使用而不是阶段package
。