如何在 Tomcat7 中部署 Grails 3.0.1 战争文件?

Posted

技术标签:

【中文标题】如何在 Tomcat7 中部署 Grails 3.0.1 战争文件?【英文标题】:How can I deploy a Grails 3.0.1 war file in Tomcat7? 【发布时间】:2015-08-20 21:27:31 【问题描述】:

如何在 Tomcat7 的非嵌入式版本中部署 Grails 3.0.1 war 文件?我得到的只是空白页或 404 错误。我可以成功部署我的其他战争文件,所以我知道这不是 Tomcat 的问题。我的版本和我采取的步骤如下:

Server version: Apache Tomcat/7.0.52 (Ubuntu)
Grails Version: 3.0.1
Groovy Version: 2.4.3
JVM Version: 1.7.0_80

我怀疑这个问题与 Spring 框架或 Gradle 有关。我对它们中的任何一个都不是很熟悉,但我确实注意到 3.0.1 不再使用 web.xml 并且不再有 Config.groovy 文件。下面的网站详细介绍了如何在 3.0.x 中部署 Grails 项目。

http://grails.github.io/grails-doc/3.0.x/guide/deployment.html

    我运行了grails run-app,它完美地部署到localhost:8080,没有任何问题。

不过,我不想使用 Tomcat 的嵌入式版本。我想将它部署到不同版本的 Tomcat,这就是我遇到问题的地方。

    我将 Tomcat 依赖项的范围更改为提供: provided "org.springframework.boot:spring-boot-starter-tomcat" 我使用grails war生成了war文件 将website.war 添加到/var/lib/tomcat7/webappssudo service tomcat7 restart重启tomcat 检查website.war 是否自动解包(确实如此) 已检查localhost:9999/website

^ 这给了我一个空白的白页。

    我删除了website.war 及其关联的解压文件夹。 已检查localhost:9999 它成功地将我带到了默认的 Tomcat 屏幕 已登录经理应用 在经理应用上部署了website.war 它给了我ok 状态 已检查localhost:9999/website

^ 这给了我以下错误:

HTTP 状态 404 - /website,请求的资源不可用。

其他相关信息:

https://grails.github.io/grails-doc/3.0.x/guide/single.html:

“Grails 3.0 不再需要 web.xml。可以通过 Spring 进行自定义”

BuildConfig.groovy 文件也已更改。

旧位置:grails-app/conf/BuildConfig.groovy 新位置:build.gradle 说明:现在在 Gradle 构建文件中定义构建时间配置

我发现的其他帖子: (抱歉没有提供链接,如果没有至少 10 个声望点,我不能发布两个以上的链接。)

grails.org/wiki/Deployment#Tomcat

这建议在 webapps 文件夹中放置一个战争。我已经尝试过了,但它不起作用。

***.com/questions/27557893/grails-app-deploy-in-tomcat-server-using-war-file-fails

他问了一个非常相似的问题,但他使用的是不同版本的 Grails 标记的解决方案引用Config.groovy 但是Grails 3.0.1 中的构建时间配置现在位于Build.gradle 不知道他是否成功解决了问题。

***.com/questions/23664421/cant-deploy-grails-war-file-in-tomcat-results-in-404

解决方案需要更改为 Config.groovyGrails 3.0.1 项目中不再提供此功能

编辑:

当它解压website.war 文件夹时,catalina.out 日志文件显示如下:

:: Spring Boot ::        (v1.2.3.RELEASE)
Jun 07, 2015 3:01:23 PM org.apache.catalina.core.ContainerBase addChildInternal
SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/website]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:147)
at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131)
at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5456)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 10 more

Jun 07, 2015 3:01:23 PM org.apache.catalina.startup.HostConfig deployWAR
SEVERE: Error deploying web application archive /var/lib/tomcat7/webapps/website.war
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/website]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

Jun 07, 2015 3:01:23 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-9999"]
Jun 07, 2015 3:01:23 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 26775 ms

然后,当我尝试加载 localhost:9999/website 时,catalina.out 文件显示如下:

Jun 07, 2015 3:05:04 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-9999"]
Jun 07, 2015 3:05:04 PM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Jun 07, 2015 3:05:04 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-9999"]
Jun 07, 2015 3:05:04 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-9999"]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/common/classes], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/common], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/server/classes], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/server], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [/usr/share/tomcat7/shared], exists: [false], isDirectory: [false], canRead: [false]
Jun 07, 2015 3:05:06 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-9999"]
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 576 ms
Jun 07, 2015 3:05:06 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jun 07, 2015 3:05:06 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.52 (Ubuntu)
Jun 07, 2015 3:05:06 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor /etc/tomcat7/Catalina/localhost/host-manager.xml
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor /etc/tomcat7/Catalina/localhost/docs.xml
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor /etc/tomcat7/Catalina/localhost/manager.xml
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor /etc/tomcat7/Catalina/localhost/examples.xml
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core_rt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/core is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt_rt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/fmt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/functions is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/permittedTaglibs is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/scriptfree is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql_rt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/sql is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml_rt is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/xml is already defined
Jun 07, 2015 3:05:07 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /var/lib/tomcat7/webapps/website.war
Jun 07, 2015 3:05:07 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/var/lib/tomcat7/webapps/website/WEB-INF/lib/tomcat-embed-core-8.0.20.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
Jun 07, 2015 3:05:07 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/var/lib/tomcat7/webapps/website/WEB-INF/lib/tomcat-embed-el-8.0.20.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/el/Expression.class
Jun 07, 2015 3:05:07 PM org.apache.catalina.deploy.WebXml setVersion
WARNING: Unknown version string [3.1]. Default version will be used.

【问题讨论】:

通过 Web UI 或通过复制到 webapps 文件夹中部署 Tomcat 实例的 catalina.out 文件后,它会显示什么? 在尝试部署website.war 后,我刚刚添加了catalina.out 消息,方法是将其复制到webapps 文件夹中。 【参考方案1】:

为了提供更全面的答案,Graeme 使用 David Gonzalez Maline 提供的链接引用了 GitHub 中的文档提交。

请注意,默认情况下,Grails 将在 WAR 文件中包含一个可嵌入版本的 Tomcat,以便它可以运行(参见前面的 部分),如果您部署到不同的版本,这可能会导致问题 雄猫。 如果您不打算使用嵌入式容器,那么您 应该先将 Tomcat 依赖项的范围更改为 @provided@build.gradle 中部署到您的生产容器:

provided "org.springframework.boot:spring-boot-starter-tomcat"

Source(强调我的)

简而言之,如果您将其保留在默认的 compile 范围内,它将包括两个不同版本的 Tomcat,Tomcat 7(您要部署到的)和 Tomcat 8(由 spring-boot-starter-tomcat 提供) .

【讨论】:

是否有可能告诉它使用“提供”而不是编译/运行时来处理某些依赖项,这取决于一个人是否想要一个 tomcat 或嵌入式 tomcat 战争?即在构建之前不必手动更改文本? @1977 我不完全理解这个问题。为什么在创建构建时要同时拥有这两个选项?您可以尝试使用命令行变量来控制事物是compile 还是provided,但我还没有尝试过。对于grailsgradle 标签来说,这可能是一个很好的问题。 例如,如果我为外部 tomcat 容器构建,我需要为某些依赖项“提供”,如果我为我们的单元测试服务器构建,我只是希望它作为“编译”并在这种情况下我希望它嵌入运行 我一直保留为provided,我仍然可以运行单元测试。当然,我使用的是grails test-app unit: 命令,而不是为单元测试服务器创建构建(我以前没有听说过这种安排,我只是让我的 CI 机器在产生战争之前运行测试)。此外,如果您可以从构建中创建一个工件,通常最好,这样您在测试中使用的任何内容都与生产相同。【参考方案2】:

答案就在这里:

https://jira.grails.org/browse/GRAILS-12105

需要声明对org.springframework.boot:spring-boot-starter-tomcat的依赖

build.gradle 中提供的那样。

【讨论】:

欢迎来到 SO。解释而不是粘贴答案的链接被认为是礼貌的。请考虑编辑您的答案,以便对访问者更有帮助。 网站不再可用

以上是关于如何在 Tomcat7 中部署 Grails 3.0.1 战争文件?的主要内容,如果未能解决你的问题,请参考以下文章

grails 2.0 - 在 Jetty 中运行,在 Tomcat 中运行

在 tomcat 上部署 grails 应用程序时创建名为“transactionManagerPostProcessor”的 bean 时出错

Grails项目BuildConfig.groovy Tomcat插件版本?

Tomcat 7 中的内存泄漏 Grails 应用程序

尝试在 Tomcat 中启动 grails App 时出现“严重:错误 listenerStart”

Grails 2.3.4 池为空。无法在 30 秒内获取连接