SWT跨平台Maven项目如何配置module-info.java兼容Windows与Linux
SWT跨平台Maven项目JPMS模块配置解决方案
你遇到的冲突本质是两个平台的SWT依赖都导出了org.eclipse.swt同名包,JPMS模块系统禁止同一个模块从多个不同模块读取同名包,且你之前直接依赖带平台后缀的模块名是错误用法,可根据需求选择以下两种方案:
方案1:分平台构建(推荐,符合JPMS规范)
步骤1:配置Maven操作系统激活Profile
在pom.xml中添加如下配置,让Maven根据构建环境自动引入对应平台的SWT依赖,避免两个依赖同时加载:
<profiles> <!-- Windows平台自动激活 --> <profile> <id>windows</id> <activation> <os> <family>Windows</family> <arch>amd64</arch> </os> </activation> <dependencies> <dependency> <groupId>org.eclipse.platform</groupId> <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId> <version>你的SWT版本号</version> </dependency> </dependencies> </profile> <!-- Linux平台自动激活 --> <profile> <id>linux</id> <activation> <os> <family>Linux</family> <arch>amd64</arch> </os> </activation> <dependencies> <dependency> <groupId>org.eclipse.platform</groupId> <artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId> <version>你的SWT版本号</version> </dependency> </dependencies> </profile> </profiles>
步骤2:编写module-info.java
SWT官方已经在所有平台构件的MANIFEST.MF中统一指定了自动模块名为org.eclipse.swt,因此不需要带平台后缀,直接写:
module 你的项目模块名 { // 其余项目依赖声明 requires org.eclipse.swt; }
该方案下本地开发会自动适配当前操作系统的依赖,打包时在对应平台执行构建即可生成对应平台的可运行包,也可以手动指定Profile构建指定平台的包,执行命令为mvn clean package -P linux或mvn clean package -P windows。
方案2:单包支持多平台(无需分平台构建,需放弃JPMS)
如果你需要打出一个包同时在Windows和Linux上运行,JPMS的模块约束无法满足这种同名包多来源的场景,直接放弃模块系统即可:
- 删掉项目中的
module-info.java,退回到类路径(ClassPath)运行模式 - 在pom.xml中直接同时引入两个平台的SWT依赖,无需配置Profile
运行时JVM会自动根据当前操作系统加载对应平台的SWT类和原生库,不会出现包冲突问题。
内容的提问来源于stack exchange,提问作者iljau
相关产品推荐
相关产品推荐

