eclipse中jdk10无法启动tomcat的问题

今天突然发现jdk10都出来了。。。并且以后的更新周期为6个月一次,也就是说9月份jdk11就出来了。

特性什么的慢慢去了解,在eclipse中(我就是喜欢eclipse),选择jdk10之后,发现tomcat启动不起来了,具体错误信息:

-Djava.endorsed.dirs=C:\java\server\apache-tomcat-9.0.7\endorsed is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.

java.endorsed.dirs在jdk9中就被取消支持了,因此使用了jdk9的话应该也会碰到这个问题(但被修复了),具体请见Java 9 support not well integrated with Tomcat webserver ,但不明白为什么在jdk10中这个问题又被重现了,再上面的连接中,有个老哥提到了一个方法(Run Confirgurations一样的操作)

  1. Right click on the project explorer over some file that is part of the project you want to run
  2. Choose Debug submenu
  3. Choose Debug configurations UI.
  4. Go to Arguments tab.
  5. Remove the -Dendorsed.dirs=”whatever” from the VM arguments textarea
  6. Click apply
  7. Click debug

这样可以运行,但只能运行一次,每次都要重新配置RunConfigurations太麻烦了,于是想找一个一劳永逸的方法,上面的回帖中提到了:

org.eclipse.jst.server.tomcat.core.internal.TomcatVersionHelper has a method called getCatalinaVMArguments that looks like it adds the endorsed dirs in. Question is, how do we detect if the selected JVM is version 9+?

也就是说TomcatVersionHelper这个类提供了一个获取vm参数的方法,但是找到源码后一看并没有,辗转一番后发现在修复jdk9 bug的时候已经去掉了 java.endorsed.dirs 的设置,具体请见:http://git.eclipse.org/c/servertools/webtools.servertools.git/diff/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatVersionHelper.java?id=d51d0f4cec6ff99e4288c53a9b8843dc7d9df97a

那么这个java.endorsed.dirs到底是在哪里提供的呢?看了下解决那次bug的文件提交(http://git.eclipse.org/c/servertools/webtools.servertools.git/commit/?id=d51d0f4cec6ff99e4288c53a9b8843dc7d9df97a)之后发现,java.endorsed.dirs 原来被放在了TomcatServerBehaviour中处理:

String version = null;
if (vmInstall instanceof IVMInstall2) {
    version = ((IVMInstall2) vmInstall).getJavaVersion();
}
if (version == null || !version.startsWith("9")) {
    String endorsedDirectories = getTomcatVersionHandler().getEndorsedDirectories(getServer().getRuntime().getLocation());
    if (endorsedDirectories.length() > 0) {
        String[] endorsements = new String[]{"-Djava.endorsed.dirs=\"" + endorsedDirectories + "\""};
        mergedVMArguments = mergeArguments(mergedVMArguments, endorsements, null, false);
        workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, mergedVMArguments);
    }
}

通过version.startWith(“9”)就明白为什么jdk10会设置 java.endorsed.dirs 了,(看来开发人员也没有想到9之后不是9.1而是10了)。

这样要解决这个问题,就要重写这个逻辑,于是去寻找TomcatServerBehaviour源码,在GitHub上可以找到:https://github.com/eclipse/webtools.servertools/blob/master/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatServerBehaviour.java#L943-L957 下载了源码之后新建了一个工程编译了下,替换了 {eclipse.home}\plugins\org.eclipse.jst.server.tomcat.core_1.1.901.v201711152105.jar 包中的 TomcatServerBehaviour,重启eclipse之后就可以正常运行tomcat了。

最后附上自己的jar包(替换到${eclipsehome}/plugins目录下):

org.eclipse.jst.server.tomcat.core_1.1.901.v201711152105.jar

如果替换了还是无法生效的话,右击项目Run as->Run Configurations,点击arguments选项卡,如果VM arguments文本框中有Djava.endorsed.dirs参数的话,直接删除保存即可 QQ截图20180423225831.png