grails 2.4 java 8和tomcat 7.0.55.2

时间:2015-12-08 09:15:41

标签: grails

我正在尝试使用带有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文件实际上可能没什么问题,尽管从开发的角度来看,找到一种更好的方法使这一切工作仍然很好。

1 个答案:

答案 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
    }
}