Java 11迁移时sun.misc.URLClassPath编译失败问题求助
问题
Java 8中引入sun.misc.URLClassPath可正常运行,迁移至Java 11后无法工作,原因是sun.misc包被移入JDK内部包。尝试在Maven编译插件中添加--add-exports参数导出相关包到模块,但执行mvn compile时仍出现找不到URLClassPath类的编译错误。
当前pom配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> <compilerArgs> <arg>--add-exports=java.base/jdk.internal.misc=com.myapp.af.util</arg> <arg>--add-opens=java.base/jdk.internal.misc=com.myapp.af.util</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
编译错误信息
[ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[6,16] cannot find symbol symbol: class URLClassPath location: package sun.misc [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[35,17] cannot find symbol symbol: class URLClassPath location: class com.myapp.af.util.AgentClassLoaderUtil [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[35,37] cannot find symbol symbol: class URLClassPath location: class com.myapp.af.util.AgentClassLoaderUtil [INFO] 3 errors [INFO] ------------------------------------------------------------- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.091 s [INFO] Finished at: 2023-06-15T16:27:46+07:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project apps: Compilation failure: Compilation failure: [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[6,16] cannot find symbol [ERROR] symbol: class URLClassPath [ERROR] location: package sun.misc [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[35,17] cannot find symbol [ERROR] symbol: class URLClassPath [ERROR] location: class com.myapp.af.util.AgentClassLoaderUtil [ERROR] /D:/apps/src/main/java/com/myapp/af/util/AgentClassLoaderUtil.java:[35,37] cannot find symbol [ERROR] symbol: class URLClassPath [ERROR] location: class com.myapp.af.util.AgentClassLoaderUtil [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
解决方案
你遗漏了两个关键配置点:
类的包路径变更
Java 11中sun.misc.URLClassPath已经迁移到jdk.internal.misc.URLClassPath,需要把代码中所有import sun.misc.URLClassPath;替换为import jdk.internal.misc.URLClassPath;。编译参数的模块范围
当前的--add-exports参数只导出到com.myapp.af.util模块,但如果你的项目是非模块化项目(没有module-info.java),需要使用ALL-UNNAMED指代所有未命名模块,修改编译参数如下:
<compilerArgs> <arg>--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED</arg> <arg>--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED</arg> </compilerArgs>
注意:jdk.internal.misc是JDK内部API,未来版本可能被移除或变更,建议优先使用公开API替代(比如java.net.URLClassLoader的公开方法)。
内容的提问来源于stack exchange,提问作者NoName
相关产品推荐
相关产品推荐

