如何将org.eclipse.swt打包到项目jar中

问题描述 投票:0回答:1

我创建了一个 Maven 项目,其中使用 SWT 作为程序的 UI。 但是当我打包项目时,发生了错误,这使得我无法将引用的附加 jar 文件打包到我的项目 jar 中。

错误信息: [警告] org.eclipse.platform:org.eclipse.swt:jar:3.127.0 的 POM 无效,传递依赖项(如果有)将不可用:为 org.eclipse 构建有效模型时遇到 1 个问题.platform:org.eclipse.swt:3.127.0 [错误] org.eclipse.platform:org.eclipse.swt.${osgi.platform} 的“dependency.dependency.artifactId”:值为“org.eclipse.swt.${osgi.platform}”的 jar 不匹配有效的 id 模式。 @

原始依赖

<dependency>
    <groupId>org.eclipse.platform</groupId>
    <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
    <version>3.127.0</version>
</dependency>

我参考了这篇文章(https://www.vogella.com/tutorials/SWT/article.html#exercise-using-the-swt-library-in-a-maven-project

在项目中创建lib文件夹,将jar放进去,然后设置依赖

<dependency>
    <groupId>org.eclipse.platform</groupId>
    <artifactId>org.eclipse.swt</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/swt.jar</systemPath>
</dependency>

我使用绝对路径作为系统路径。

但是打包的时候,没有办法将swt打包到jar中

在插件中,我还设置了maven-assemble-plugin。

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.4.2</version>
  <configuration>
    <archive>
        <manifest>
            <mainClass>cc.demo.SwtDemo.App</mainClass>
        </manifest>
    </archive>
   </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
        <mainClass>cc.demo.SwtDemo.App</mainClass>
    </archive>
  </configuration>
</plugin>

当我运行输出jar时,我会遇到异常。

线程“main”中的异常 java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Layout 在 cc.derick.YouTubeMemberEmojiDownloader.App.main(App.java:11) 引起原因:java.lang.ClassNotFoundException:org.eclipse.swt.widgets.Layout 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ... 1 个以上

我尝试使用 Eclispe 中的 Maven 构建工具 我还尝试在终端上发出 mvn clean package 命令。 结果是一样的。

java maven swt
1个回答
0
投票
  • Swt 根据不同的操作系统需要不同的软件包。

  • 使用不同的Profiles设置依赖的groupId、artifactId、version对应的变量swt.groupId、swt.artifactId、swt.version。

  • 或者您可以将当前开发的操作系统平台对应的swt artifactId和SWT版本硬编码到依赖中。

maven pom.xml

...

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.4.2</version>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <mainClass>cc.demo.SwtDemo.App</mainClass>
      </manifest>
      <manifestEntries>
        <built-by />
        <!-- add empty for not add user name -->
        <Class-Path>.</Class-Path>
        <App-Version>${project.version}</App-Version>
      </manifestEntries>
    </archive>
  </configuration>
</plugin>


<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>appassembler-maven-plugin</artifactId>
  <version>2.1.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>assemble</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <programs>
      <program>
        <mainClass>cc.demo.SwtDemo.App</mainClass>
        <id>SwtDemo.App</id>
      </program>
    </programs>
    <extraJvmArguments>
-Duser.language=en
-Duser.country=US
-Dfile.encoding=UTF-8
-Xms128M
-Xmx756M
    </extraJvmArguments>
    <repositoryLayout>flat</repositoryLayout>
    <useWildcardClassPath>true</useWildcardClassPath>
    <binFileExtensions>
      <!--<unix>.sh</unix> -->
    </binFileExtensions>
    <repositoryName>lib</repositoryName>
  </configuration>
</plugin>

...

<dependencies>
  <dependency>
    <groupId>${swt.groupId}</groupId>
    <artifactId>${swt.artifactId}</artifactId>
    <version>${swt.version}</version>
  </dependency>
</dependencies>

<profiles>

  <!-- Linux -->
  <profile>
    <id>linux</id>
    <activation>
      <os>
        <name>Linux</name>
        <arch>amd64</arch>
      </os>
    </activation>
  <properties>
    <swt.groupId>org.eclipse.platform</swt.groupId>
    <swt.artifactId>org.eclipse.swt.gtk.linux.x86_64</swt.artifactId>
    <swt.version>3.119.0</swt.version>
  </properties>
  </profile>

  <!-- Windows -->
  <profile>  
    <id>windows</id>
    <activation>
      <os>
        <name>Windows 10</name>
        <arch>amd64</arch>
      </os>
    </activation>
    <properties>
      <swt.groupId>org.eclipse.platform</swt.groupId>
      <swt.artifactId>org.eclipse.swt.win32.win32.x86_64</swt.artifactId>
      <swt.version>3.119.0</swt.version>
    </properties>
  </profile>
  
  <!-- MacOSX -->
  <profile>
    <id>macosx</id>
    <activation>
      <os>
        <name>Mac OS X</name>
        <arch>x86_64</arch>
      </os>
    </activation>
    <properties>
      <swt.groupId>org.eclipse.platform</swt.groupId>
      <swt.artifactId>org.eclipse.swt.cocoa.macosx.x86_64</swt.artifactId>
      <swt.version>3.119.0</swt.version>
    </properties>
  </profile>
</profiles>

<repositories>
  <!-- add for swt -->
  <repository>
    <id>repo1</id>
    <name>repo1</name>
    <url>https://repo1.maven.org/maven2</url>
  </repository>
</repositories>

© www.soinside.com 2019 - 2024. All rights reserved.