Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Maven构建多架构SWT应用程序_Java_Eclipse_Maven_Swt - Fatal编程技术网

Java 使用Maven构建多架构SWT应用程序

Java 使用Maven构建多架构SWT应用程序,java,eclipse,maven,swt,Java,Eclipse,Maven,Swt,我已经为SWT应用程序设置了一个Maven项目。该应用程序运行在多个平台(OS X、Windows 64位、Windows 32位、Linux 64位和Linux 32位)上,我对其进行了设置,以便在运行Maven时检测平台,并将打包的应用程序转到不同的目标目录。以下是pom.xml中实现此目的的相关部分: <profiles> <profile> <id>linux_x86_64</id> <activation>

我已经为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>

linux_x86_64
linux
amd64
${project.basedir}/target/${project.version}/linux_x86_64
win32_x86_64
linux
i386
${project.basedir}/target/${project.version}/win32_x86_64
...
SWT使用的依赖关系如下:

<dependencies>
  <dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>swt</artifactId>
    <version>3.7.2.v3740</version>
  </dependency>
...
</dependencies>

org.eclipse
swt
3.7.2.v3740
...
为了清楚起见,我在本地存储库中安装了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依赖插件的“lib”文件夹,maven足够聪明,可以复制SWT虚拟包和打包应用程序的机器的平台特定包。到目前为止还不错

问题是我想从一台机器上编译不同平台的应用程序。我将如何实现这一点

我尝试在每个配置文件中设置一个属性,每个平台都需要SWT jar,如下所示(Windows 64位的示例):


swt.win32.x86_64
3.7.2
但是采用这种方法,特定于概要文件的SWT jar和我运行Maven的特定于平台的SWT jar都被复制到“lib”目录中,最后得到三个jar:

  • swt-3.7.2.v3740.jar
  • swt.gtk.linux.x86_64-3.7.2.jar
  • swt.win32.x86_64-3.7.2.jar
有没有一种方法可以让我忽略运行它的机器来指定一个概要文件,这样我就不需要手动删除它的SWT jar了


提前感谢。

不确定dependency插件如何处理它,但如果您只有一个这样的依赖项,它应该可以工作:

    <dependency>
        <groupId>${swt.groupId}</groupId>
        <artifactId>${swt.artifactId}</artifactId>
        <version>3.7.2</version>
        <scope>compile</scope>
    </dependency>

${swt.groupId}
${swt.artifactId}
3.7.2
编译
然后是这样的配置文件:

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

gtk_linux_x86_64
linux
x86_64
org.eclipse.swt.gtk.linux
x86_64
现在,所需的SWT get版本将自动使用,但也可以使用以下方法设置为您需要的版本(例如,在构建发行版时):

mvn-p gtk_linux_x86_64


注意:根据需要更改您的groupId和artifactId。

这正是我第一次尝试的,结果与我最初问题中描述的结果完全相同。似乎不管怎样,Maven都会打包运行它的系统的SWT jar。很抱歉,您可能想尝试一下这个:谢谢,我一定会尝试一下,尽管我怀疑Maven无论如何都会尝试从主机打包库。我会随时通知你的。我期待着你的报告,我自己从未使用过这个项目。
<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>