如何配置IDEA支持Multi-Release Jar(MRJar)开发
IDEA 配置支持 MRJar(多版本Jar)开发的方法
直接把java、java9都标记为普通源码根时,IDEA默认会把两个目录的类加入同一个编译类路径,同全限定名的类必然报重复,不符合MRJar按JDK版本加载对应类的逻辑,需要按以下方式配置:
方案一:使用Maven/Gradle标准MRJar配置(推荐)
不用手动标记源码目录,按MRJar规范编写构建配置,IDEA会自动识别多版本源码结构,不会报重复类错误。
以Maven为例,pom.xml核心配置如下:
<build> <plugins> <!-- 多版本编译配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <!-- 基础版本编译(对应java目录) --> <configuration> <source>1.8</source> <target>1.8</target> </configuration> <executions> <!-- Java 9版本类编译(对应java9目录) --> <execution> <id>compile-java9</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <release>9</release> <compileSourceRoots> <compileSourceRoot>${project.basedir}/main/java9</compileSourceRoot> </compileSourceRoots> <multiReleaseOutput>true</multiReleaseOutput> </configuration> </execution> </executions> </plugin> <!-- Jar包标记为多版本Jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifestEntries> <Multi-Release>true</Multi-Release> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>
配置写完后重新导入Maven项目,IDEA会自动识别java9为Java 9版本专属源码目录,调试/运行时会根据当前项目设置的JDK版本自动加载对应路径下的DefaultVersion实现,不会报重复类错误。
方案二:无构建工具,手动配置IDEA项目
如果是纯手动创建的本地项目,不用Maven/Gradle,按以下步骤配置:
- 打开项目结构设置(快捷键
Ctrl+Alt+Shift+S/macOS 为Cmd+;),进入「Modules」- 对应模块的「Sources」标签 - 先取消
java9目录的普通源码根标记,仅把main/java标记为普通Sources Root,对应项目兼容的最低JDK版本(比如JDK 8) - 选中
main/java9目录,在右侧配置栏把它的SDK指定为JDK 9,设置它的编译输出路径为项目输出根目录/META-INF/versions/9,符合MRJar高版本类的存放规范 - 进入「Dependencies」标签页,调整源码条目的顺序:把
java9对应的源码条目放在java源码条目之后,设置java9条目的作用域为Compile,配置规则为仅在JDK版本 >=9 时生效 - 打开设置页「Build, Execution, Deployment -> Compiler -> Java Compiler」,找到对应模块,勾选Enable multi-release JAR support,填写最低支持版本为8,添加Java 9版本对应的源码路径为
main/java9
配置完成后可以切换项目SDK验证:SDK切到JDK 8时,DefaultVersion会走java目录下的实现;切到JDK 9及以上版本时,自动走java9目录下的实现,重复类报错会消失。
内容的提问来源于stack exchange,提问作者askaquestion
相关产品推荐
相关产品推荐

