我已经为SWT应用程序设置了一个Maven项目。该应用程序可以在多个平台(OS X,Windows 64位,Windows 32位,Linux 64位和Linux 32位)上运行,并且已经对其进行了设置,以便在运行Maven并将其打包时可以检测到该平台。应用程序转到不同的目标目录。以下是pom.xml的相关部分以实现此目的:
<profiles>
<profile>
<id>linux_x86_64</id>
<activation>
<os>
<name>linux</name>
<arch>amd64</arch>
</os>
</activation>
<build>
<directory>${project.basedir}/target/${project.version}/linux_x86_64</directory>
</build>
</profile>
<profile>
<id>win32_x86_64</id>
<activation>
<os>
<name>linux</name>
<arch>i386</arch>
</os>
</activation>
<build>
<directory>${project.basedir}/target/${project.version}/win32_x86_64</directory>
</build>
</profile>
...
</profiles>
用于SWT的依赖关系是这样的:
<dependencies>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>swt</artifactId>
<version>3.7.2.v3740</version>
</dependency>
...
</dependencies>
为了清楚起见,我在本地存储库中安装了SWT虚拟程序包(org.eclipse.swt_3.7.2.v3740f.jar)和所有特定于平台的程序包(org.eclipse.swt.gtk.linux.x86_64_3.7.2 .v3740f,org.eclipse.swt.win32.x86_64_3.7.2.v3740f等)。
我打包依赖关系的方式是使用maven-dependency-plugin使用“lib”文件夹,并且Maven足够聪明,可以复制SWT虚拟程序包和打包应用程序的特定于机器的平台之一。到目前为止,一切都很好...
问题是我想在一台机器上为不同平台编译应用程序。我将如何实现?
我尝试过使用每个平台所需的SWT jar在每个配置文件中设置属性,例如(对于Windows 64位示例):
<properties>
<swt.artifactId>swt.win32.x86_64</swt.artifactId>
<swt.version>3.7.2</swt.version>
</properties>
但是,采用这种方法时,将特定于配置文件的SWT jar和我运行Maven的特定于平台的方法都复制到“lib”目录中,最后得到三个jar:
有没有一种方法可以指定一个配置文件,而忽略运行它的机器,从而无需手动删除其SWT jar?
提前致谢。
最佳答案
不确定depency-plugin的处理方式,但是如果您只有一种依赖关系,它应该可以工作:
<dependency>
<groupId>${swt.groupId}</groupId>
<artifactId>${swt.artifactId}</artifactId>
<version>3.7.2</version>
<scope>compile</scope>
</dependency>
然后像这样的配置文件:
<profile>
<id>gtk_linux_x86_64</id>
<activation>
<os>
<name>linux</name>
<arch>x86_64</arch>
</os>
</activation>
<properties>
<swt.groupId>org.eclipse.swt.gtk.linux</swt.groupId>
<swt.artifactId>x86_64</swt.artifactId>
</properties>
</profile>
现在所需的SWT版本会自动使用,但也可以使用以下命令将其设置为所需的版本(例如,构建发行版时):
mvn -P gtk_linux_x86_64
注意:根据需要更改groupId和artifactId。