使用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