如何复活基于SWT和Maven的旧Java项目并适配Java 1.8?
我正在复活Java 1.5时代的旧代码,项目用Maven构建(我不熟悉Maven,版本可能较旧),依赖SWT技术(同样不熟悉)。目标是升级到Java 1.8并完成编译,已经修改了MANIFEST.MF中的Bundle-RequiredExecutionEnvironment: JavaSE-1.8,也把pom.xml里的<source>和<target>设为1.8。
执行Maven构建时出现大量错误,核心问题是SWT依赖无法解析:
[WARNING] The POM for swt:org.eclipse.jface_3.2.0:jar:R is missing, no dependency information available
[WARNING] The POM for swt:org.eclipse.swt.win32.win32.x86_3.2.0:jar:R is missing, no dependency information available
[WARNING] The POM for swt:org.eclipse.swt_3.2.0:jar:R is missing, no dependency information available
[WARNING] The POM for swt:org.eclipse.core.commands_3.2.0:jar:R is missing, no dependency information available
[...]
[ERROR] Failed to execute goal on project MyProject: Could not resolve dependencies for project MyGroupId:MyArtifactId:jar:0.01: The following artifacts could not be resolved: swt:org.eclipse.jface_3.2.0:jar:R, swt:org.eclipse.swt.win32.win32.x86_3.2.0:jar:R, swt:org.eclipse.swt_3.2.0:jar:R, swt:org.eclipse.core.commands_3.2.0:jar:R: Failure to find swt:org.eclipse.jface_3.2.0:jar:R in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
项目的相关依赖配置如下:
<dependency> <groupId>swt</groupId> <artifactId>org.eclipse.jface_3.2.0</artifactId> <version>R</version> <scope>compile</scope> </dependency> <dependency> <groupId>swt</groupId> <artifactId> org.eclipse.swt.win32.win32.x86_3.2.0 </artifactId> <version>R</version> <scope>compile</scope> </dependency> <dependency> <groupId>swt</groupId> <artifactId>org.eclipse.swt_3.2.0</artifactId> <version>R</version> <scope>compile</scope> </dependency> <dependency> <groupId>swt</groupId> <artifactId>org.eclipse.core.commands_3.2.0</artifactId> <version>R</version> <scope>compile</scope> </dependency>
多年来SWT的仓库、groupId和artifactId都变了,很多旧版本已经找不到了。我试过更新依赖到新版本,但大多依赖更高版本的Java。想问有没有能在Java 1.8环境下运行的有效SWT依赖列表?
更新:我查了Eclipse仓库,发现:
- org.eclipse.platform / org.eclipse.jface / 3.12.1 - 适配Java 8
- org.eclipse.platform / org.eclipse.core.commands / 3.10.100 - 适配Java 11
- org.eclipse.platform / org.eclipse.swt / 3.126.0 & 3.128.0 - 适配Java 17;JAR里没有class文件;没找到其他带实际JAR文件的版本
- org.eclipse.platform / org.eclipse.swt / 3.127.0 & 3.128.0 - 适配Java 17;没找到其他带实际JAR文件的版本
我猜测原代码作者应该是下载了特定的SWT JAR包,手动放到本地仓库里的。
针对Java 1.8环境,以下是可用的SWT及相关组件依赖配置,同时解决依赖解析问题:
1. 正确的SWT依赖配置(适配Java 8)
SWT从旧版本到现在的groupId、artifactId规则已经变更,Java 8兼容的最新稳定版本是3.108.0,对应的依赖需要区分操作系统和架构。以Windows x86为例,配置如下:
<!-- 先添加Eclipse仓库到pom.xml的<repositories>节点 --> <repositories> <repository> <id>eclipse-releases</id> <url>https://repo.eclipse.org/content/groups/releases/</url> </repository> </repositories> <!-- SWT核心依赖(Windows 32位),64位替换为org.eclipse.swt.win32.win32.x86_64 --> <dependency> <groupId>org.eclipse.platform</groupId> <artifactId>org.eclipse.swt.win32.win32.x86</artifactId> <version>3.108.0</version> <scope>compile</scope> </dependency> <!-- JFace(适配Java 8的3.12.1版本) --> <dependency> <groupId>org.eclipse.platform</groupId> <artifactId>org.eclipse.jface</artifactId> <version>3.12.1</version> <scope>compile</scope> </dependency> <!-- 核心命令组件:Java 8兼容的3.9.0版本 --> <dependency> <groupId>org.eclipse.core</groupId> <artifactId>org.eclipse.core.commands</artifactId> <version>3.9.0</version> <scope>compile</scope> </dependency>
说明:
- 3.108.0是SWT最后一个支持Java 8的正式版本,后续版本均要求Java 11+
- 不同操作系统需替换对应的artifactId:比如Linux 64位是
org.eclipse.swt.gtk.linux.x86_64,macOS是org.eclipse.swt.cocoa.macosx.x86_64
2. 清理本地旧依赖缓存
如果原项目曾经手动安装过旧SWT JAR,先清理本地Maven仓库中swt组下的所有文件,避免干扰新依赖解析:
# Windows系统 rmdir /s /q %USERPROFILE%\.m2\repository\swt # Linux/macOS系统 rm -rf ~/.m2/repository/swt
3. 强制更新依赖
执行Maven构建时加-U参数,强制刷新依赖缓存:
mvn clean install -U
4. 替代方案:手动安装旧SWT版本
如果代码依赖SWT 3.2.0的特定API无法升级,可以手动下载对应版本的JAR,安装到本地Maven仓库:
# 以org.eclipse.swt_3.2.0.jar为例 mvn install:install-file -Dfile=org.eclipse.swt_3.2.0.jar -DgroupId=swt -DartifactId=org.eclipse.swt_3.2.0 -Dversion=R -Dpackaging=jar
其他几个依赖包按同样方式执行即可。
内容的提问来源于stack exchange,提问作者Pixel

