我创建了一个 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 命令。 结果是一样的。
Swt 根据不同的操作系统需要不同的软件包。
使用不同的Profiles设置依赖的groupId、artifactId、version对应的变量swt.groupId、swt.artifactId、swt.version。
或者您可以将当前开发的操作系统平台对应的swt artifactId和SWT版本硬编码到依赖中。
...
<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>