我试图使用带有tomcat插件的grails 2.4.4运行https站点:
build ':tomcat:7.0.55.2'
首次尝试启动应用程序时,我遇到了以下问题:问题648
java.lang.ClassNotFoundException: com.ibm.crypto.tools.KeyTool
当我将tomcat的tomcat依赖项更改为tomcat 8.0.22并再次运行app时,它会成功并超越,即createSSLCertificate(File keystoreDir)工作,尽管应用程序无法启动.如果我现在将其更改回tomcat 7.0.55.2,则已生成密钥并且应用程序正常工作.
我想问题是我不确定Graeme指向的修复程序是否只存在于tomcat 8中,或者是否有更高版本的tomcat 7我可以使用它修复了这个问题.
虽然这个hack对于开发机器来说还可以,但是当我通过jenkins等建立应用程序时,我真的需要更具体的东西.
要在本地重新创建,如果我这样做
grails clean-all
并尝试
grails run-app -https
我第一次遇到这个问题,直到我再次重复上述步骤.
考虑到它詹金斯生成一个WAR文件可能实际上很好,虽然从开发的角度来看,找到一个更好的方法来完成这一切仍然很好.
我自己也遇到过这个问题.我已经尝试了一些我在互联网上找到的其他解决方案,直到我偶然发现 https://github.com/grails/grails-profile-repository/pull/14/files 这对我来说解决了这个问题并运行我的应用程序用-https
转到TomcatServer.groovy
并替换:
protected getKeyToolClass() { try { Class.forName 'sun.security.tools.KeyTool' } catch (ClassNotFoundException e) { // no try/catch for this one, if neither is foun\d let it fail Class.forName 'com.ibm.crypto.tools.KeyTool' } }
有:
protected Class getKeyToolClass() { try { try { // Sun JDK 8 return Class.forName('sun.security.tools.keytool.Main') } catch (ClassNotFoundException e1) { try { // Sun pre-JDK 8 return Class.forName('sun.security.tools.KeyTool') } catch (ClassNotFoundException e2) { // no try/catch for this one, if neither is found let it fail return Class.forName('com.ibm.crypto.tools.KeyTool') } } } catch (Throwable e) { return null } }