如何在 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/webapps
跑sudo 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.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.
【问题讨论】:
通过 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
,但我还没有尝试过。对于grails
和gradle
标签来说,这可能是一个很好的问题。
例如,如果我为外部 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插件版本?