- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的问题是:如何使用 maven 一次根据目标操作系统/体系结构为 SWT 应用程序生成多个可执行 Jar 文件(包括依赖项)?
我创建了一个 SWT 应用程序,它必须在不同的操作系统和架构上运行。该项目是一个包含父 POM 的 Maven 多模块项目。
project-pom.xml (packaging = pom, specify SWT dependencies)`- application-module (inherit SWT dependencies) `- pom.xml (packaging = jar)`- domain-specific-module `- pom.xml (packaging = jar)`- utils-module (inherit SWT dependencies) `- pom.xml (packaging = jar)
In the parent POM (project-pom.xml
) I've included the SWT dependencies according to my os and architecture using maven profiles which works fine:
<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
检查了 Activity 配置文件。
现在我想为目标平台 linux_x86_64/amd64、windows_x86 和 windows_x86_64 生成可执行 Jars。在第一步中,我使用了 maven-jar-plugin生成 Jar 和 list 文件 (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 已生成, list 在其中。如您所见,我的意图是将所有依赖项放在名为 lib/
的目录中。但是 Jar 文件不可执行(缺少库)。
下一步(理论上)是在 package
阶段找到依赖项并将它们复制到 die 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 文件都在那里。
这是我遇到的第一个问题。下一个问题是,我如何根据我的 SWT 应用程序的目标操作系统/体系结构同时创建多个(不仅仅是一个)可执行 Jar 文件(使用一个命令,如 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生成 native windows 可执行文件(最终用户不喜欢非 native 可执行文件的感觉)使用之前生成的 windows 可执行 Jar 文件。
我希望这些信息足够了。
最佳答案
我通过研究 JackRabbit 使用 Maven 完成了此操作的设置。 JackRabbit 以各种形式(独立、OSGi bundle 、web 应用程序等)交付,并且全部通过一个聚合器 pom 完成。
第一步是将带有配置文件和公共(public)依赖项的父 pom 与定义项目子模块(顺序)的聚合器 pom 分开。聚合器 pom 中的第一个子模块通常是父 pom。聚合器 pom 的优点是您可以使用聚合器 pom 运行 Maven,一次性为您的项目构建所有内容。
接下来我创建了一个“公共(public)程序集资源”项目,它生成一个包含所有资源(例如自述文件、手册、图片等)的 jar,这些资源在平台的所有程序集中使用。每个平台组装项目都会提取这个 jar,然后将提取的文件复制到适当的位置。据我所知,JackRabbit 不会这样做,因此您可以跳过这一步。
最后,为每个平台创建一个单独的平台组装子模块。在平台组件中,您可以设置您想要和不想要的依赖项。子模块可以包含特定于平台的文件(例如,Windows 的批处理文件、Linux 的 .sh 文件)。程序集形式可以特定于平台(例如 Windows 的 .zip 和 Linux 的 .tar.gz)。对于 Windows,我还包括了 NSIS创建一个 setup.exe(您也可以在安装了 NSIS 软件包的 Linux 上构建它)。
我在不同阶段的设置中大量使用了 maven-dependency-plugin。我经常使用的一个是 process-resources
阶段,您可以尝试使用 package
阶段。
关于java - 使用 Maven 为 SWT 应用程序构建多平台可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285598/
我在使用 gradle 构建一个特定应用程序时遇到问题。该应用程序可以用 eclipse 编译和构建,它在平板电脑上运行良好。当我尝试使用 Gradle 构建它时,“compileDebugJava”
我有一个 C 程序,是一位离开的开发人员留给我的。我试图弄清楚他到底在做什么,并将软件重新安排成更合乎逻辑的东西,这样我就可以更轻松地构建它。我正在使用 CMake 构建,而他使用的是 Make。 有
我刚开始阅读“Pro Spring MVC with web flow”,它附带了一个我想遵循的代码示例。 我要什么 - 我想像书中那样构建应用程序,使用 Gradle 有什么问题 - 我没用过 Gr
我希望有人已经这样做了。我正在尝试为我的一个 angular 2 项目在 teamcity 中建立一个连续的构建。在做了一些研究之后,我按照以下步骤操作: 构建步骤 1:为 teamcity 安装 j
我有一个旧的 ASP.Net 网站解决方案,看起来像: 当我在 Visual Studio 中构建解决方案时,我得到以下输出: ------ Build started: Project: C:\..
我使用 gulp-usref、gulp-if、gulp-uglify、gulp-csso 和 gulp-file-include 来构建我的应用程序。除了 HTML 保持原样外,构建中的一切都运行良好
我正在使用 ionic2 开发内部移动应用程序。我可以通过以下方式成功构建 ios: ionic build ios and ionic build ios --prod 但当我这样做时,它一直失败
我是一位经验丰富的 .NET/C# 开发人员,但对这里的几乎所有技术/库(包括 SQL/DB 工作)都是新手。 我正在开发一个具有 Azure/Entity Framework .NET 后端和可移植
我正在使用 VS 2008。我可以使用 IDE 成功编译我的解决方案。但是,当我尝试使用 devenv.com 构建它时,它失败并提示“错误:找不到项目输出组'(无法确定名称)的输出”。该组、其配置或
版本: ember.js 2.7,ember-data 2.7 ember-cli 2.9.1//同样适用于 ember-cli 2.7 node 6.9.1, npm 3.10.9//也适用于 no
我第一次修补 AzureDevops,设置一些 CI 任务。 我有一个公共(public)存储库(开源)和一个包含 3 个 F# 项目的解决方案(.sln)。该解决方案在 Windows/Mac/Li
目前 5.1.5 版本或 STLPort CVS 存储库似乎仍不支持 VS2008。如果有人已经完成了这项工作,那么如果可能的话,分享会很有用:) 同样,了解 VS2005 或 2008 x64 构建
我有一个 Python 2.7 项目,到目前为止一直使用 gfortran 和 MinGW 来构建扩展。我使用 MinGW,因为它似乎支持 Fortran 代码中的写入语句和可分配数组,而 MSVC
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我想知道为什么在 Zimbra Wiki 中只列出了构建过程的特定平台。这意味着不可能在其他 Linux 发行版上构建 Zimbra? Zimbra 社区选择一个特殊的 Linux 发行版来构建 Zi
我将在 Swift 中构建一个 CLI 工具。我用这个命令创建了项目 swift package init --type executable当我构建我的项目并解析 时读取别名 Xcode 中的参数并
我想为添加到 docker 镜像的文件设置文件权限。我有这个简单的 Dockerfile: FROM ubuntu:utopic WORKDIR /app RUN groupadd -g 1000 b
当我使用 clBuildProgram在我的 OpenCl 代码中,它失败并显示错误代码 -11,没有任何日志信息。 这是我的代码的样子: ret = clBuildProgram(program
我有一个底部导航栏,它有一个列表页面,该页面使用状态块。 class _MainPageState extends State { int _index = 0; @override Wi
我在本地计算机上使用Jenkins(Jenkins URL未通过Internet公开,但该计算机上已启用Internet。) 我进行了以下配置更改: 在Jenkins工具上安装了Git和Github插
我是一名优秀的程序员,十分优秀!