在部署应用程序时,简单性是最大的优势。 您将了解到,尤其是在项目发展且需要在环境中进行某些更改时。 将整个应用程序打包到一个独立且自足的JAR中似乎是个好主意,尤其是与在目标环境中安装和升级Tomcat相比。 过去,我通常将Tomcat JARs
包含在我的Web应用程序中,并使用Tomcat API编写瘦命令行运行程序。 幸运的是,有一个tomcat7:exec-war
maven目标可以做到这一点。 它需要您的WAR工件并将其与所有Tomcat依赖项打包在一起。 最后,它还包含要显示的Tomcat7RunnerCli
Main-class
。
想尝试一下吗? 接受您现有的WAR项目并将以下内容添加到pom.xml
:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>/standalone</path>
<enableNaming>false</enableNaming>
<finalName>standalone.jar</finalName>
<charset>utf-8</charset>
</configuration>
</execution>
</executions>
</plugin>
运行mvn
package,几秒钟后,您将在目标目录中找到闪亮的standalone.jar
。 运行您的Web应用程序从未如此简单:
$ java -jar target/standalone.jar
…您可以浏览localhost:8080/standalone
。 尽管path
参数的文档说(重点是我):
用于正在运行的Web应用程序的webapp上下文路径。 将Webapp存储在exec jar中的名称。 不要在我们两个人之间使用 /,毕竟<path>/</path>
似乎可以工作。 事实证明,内置main
类实际上要灵活一些。 例如,您可以说(我希望这是不言而喻的):
$ java -jar standalone.jar -httpPort=7070
这有什么runnable
JAR
所做的就是第一个解压缩它的WAR文件中的一些目录( extract
通过default1
),并将其部署到Tomcat -所有必需的Tomcat JARs
也包括在内。 空的standalone.jar(内部几乎没有KiB WAR)的权重约为8.5 MiB
–如果您声称将每个版本的整个Tomcat与应用程序一起推送是浪费的,那么就不算多。
在谈论Tomcat JARs
,您应该想知道如何选择此runnable
包含的Tomcat版本? 不幸的是,我找不到任何简单的选项,因此我们必须回到显式重新定义插件依赖项(2.0版已将7.0.30 Tomcat硬编码)。 这很无聊,但没有那么复杂,可能对将来的参考很有用:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tomcat7Version>7.0.33</tomcat7Version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>/standalone</path>
<enableNaming>false</enableNaming>
<finalName>standalone.jar</finalName>
<charset>utf-8</charset>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-util</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper-el</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-el-api</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-tribes</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-ha</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat7Version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
在下一篇文章中,我们将学习如何处理出现在终端java.util.logging
这些讨厌的Tomcat内部日志( java.util.logging
…)。与此同时,我发现并报告了MTOMCAT-186。关闭可执行文件JAR不会调用ServletContextListener.contextDestroyed()
–看看这是否适合您。
1 -这可能是一个好主意,用指定不同的目录- extractDirectory
与每次重新启动前清理- resetExtract
。
参考: Java和社区博客中来自JCG合作伙伴 Tomasz Nurkiewicz的带有可运行Tomcat的独立Web应用程序 。
翻译自: https://www.javacodegeeks.com/2012/11/standalone-web-application-with-executable-tomcat.html