我正在尝试使用带有tomcat插件的grails 2.4.4运行https站点:
build ':tomcat:7.0.55.2'
首次尝试启动应用时,我遇到了以下问题:issue 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
我第一次遇到这个问题,直到我再次重复上述步骤。
考虑到它Jenkins生成一个WAR文件实际上可能没什么问题,尽管从开发的角度来看,找到一种更好的方法使这一切工作仍然很好。
答案 0 :(得分:6)
我自己也遇到过这个问题。我在互联网上找到了其他一些解决方案,直到我偶然发现 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
}
}