使用 Java 命令直接运行 WAR 包

在 Java 开发中,WAR(Web Application Archive)包是一个非常常见的部署格式,通常用于将 Java Web 应用程序打包并发布到服务器上。许多人会对此产生疑问:是否可以直接使用 Java 命令来运行一个 WAR 包而不需要将其部署到一个应用服务器中?

1. 理解 WAR 包

WAR 包是一种用于分发 Java Web 应用程序的压缩文件,里面包含了所有必要的文件(如 JSP 文件、Servlets、HTML、CSS 和 JavaScript)。它通常以 .war 结尾,并可以被 Web 服务器(如 Apache Tomcat、Jetty 等)解压并运行。 WAR 包的结构大致如下:

myapp.war
├── WEB-INF
│   ├── classes
│   └── lib
├── index.jsp
└── styles.css
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2. 使用 Java 命令运行 WAR 包

Java 9 及以上版本引入了一个称为 java -jar 的命令,可让您直接从命令行运行 WAR 包。当然,这个 WAR 包需要打包成一个可运行的 JAR 包,通常需要加入一个入口点。这可以通过添加一个 MANIFEST.MF 文件来实现,内容如下:

Manifest-Version: 1.0
Main-Class: org.eclipse.jetty.server.Server
  • 1.
  • 2.

3. 使用 Jetty 运行 WAR 包

Jetty 是一个轻量级的 Java Web 服务器,适用于嵌入式和单独的应用程序。我们可以通过 Jetty 来直接运行 WAR 包,而不需要外部的应用服务器。首先,我们需要在项目中引入 Jetty 依赖。以下是 Maven 中的依赖配置:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.4.44.v20210927</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>9.4.44.v20210927</version>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

4. 创建一个简单的 Jetty Server 示例

接下来,创建一个简单的 Java 类,利用 Jetty 运行我们的 WAR 包:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class RunWarExample {
    public static void main(String[] args) throws Exception {
        // 创建一个 Jetty 服务器实例
        Server server = new Server(8080);

        // 创建 WebAppContext 并指定 WAR 文件路径
        WebAppContext context = new WebAppContext();
        context.setContextPath("/");
        context.setResourceBase("path/to/your.war"); // 替换为你的 WAR 路径

        server.setHandler(context);

        // 启动服务器
        server.start();
        server.join();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

在以上代码中,我们创建了一个 Jetty 服务器,设置了一个处理我们 WAR 包的 Web 应用上下文,并在端口 8080 上运行。

5. 启动 WAR 包

假设我们已经将以上代码保存为 RunWarExample.java,为了编译并运行该程序,可以使用以下命令:

javac -cp ".;path/to/jetty-server-9.4.44.v20210927.jar;path/to/jetty-servlet-9.4.44.v20210927.jar" RunWarExample.java
java -cp ".;path/to/jetty-server-9.4.44.v20210927.jar;path/to/jetty-servlet-9.4.44.v20210927.jar" RunWarExample
  • 1.
  • 2.

6. 代码执行流程图

通过以下序列图展示了使用 Jetty 运行 WAR 包的基本流程:

WAR 包 Jetty Server Java 命令 用户 WAR 包 Jetty Server Java 命令 用户 执行 java 命令 初始化 Jetty Server 加载 WAR 包 WAR 包加载完成 返回启动的 Jetty Server

7. 资源与时间管理图

接下来,我们可以使用甘特图展示项目的基本时间安排:

构建 Jetty 服务器并运行 WAR 包 2023-10-01 2023-10-01 2023-10-02 2023-10-02 2023-10-03 2023-10-03 2023-10-04 2023-10-04 2023-10-05 2023-10-05 2023-10-06 创建 Java 类 配置 Maven 依赖 编译代码 运行 WAR 包 步骤 构建 Jetty 服务器并运行 WAR 包

总结

通过使用 Jetty 作为内嵌服务器,我们能够非常方便地使用 Java 命令直接运行一个 WAR 包。这使得测试和开发变得更加高效,而不需要每次都部署到一个正式的 Web 服务器上。希望这篇文章能为你在 Java Web 开发时带来帮助。如果你需要进一步了解 Jetty 或者其他的 Web 服务器,请参考其官方文档。