问题 如何在Tomcat7中部署Grails 3.0.1 war文件?


我该如何部署? Grails 3.0.1 war文件,Tomcat7的非嵌入式版本?我得到的只是一个空白页面或404错误。我可以成功部署其他war文件,所以我知道这不是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

  1. 我跑了 grails run-app 它部署到 localhost:8080 精美没有任何问题。

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

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

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

  1. 我删掉了 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文件夹中发起了一场战争。我已经尝试过了,但它没有用。

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

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

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

  • 解决方案需要改变 Config.groovy,已不再提供 Grails 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.

1476
2018-06-05 20:00


起源

什么是 catalina.out 通过Web UI部署或通过复制到Tomcat实例后显示的文件 webapps 夹? - Welsh
我刚加了 catalina.out  尝试部署后的消息 website.war 通过将其复制到 webapps 夹。 - randyrocketship


答案:


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

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

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

资源 (强调我的)

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


7
2017-09-16 16:50



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


答案在这里:

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

您需要将依赖项声明为“org.springframework.boot:spring-boot-starter-tomcat”

在build.gradle中提供


4
2017-07-16 23:40



欢迎来到SO。解释是有礼貌的,而不是粘贴答案的链接。请考虑编辑您的答案,这样对访问者会更有帮助。 - PavoDive
网站不再可用 - Leo