spring-mvc項目整合jetty實現單war包自啟動webapp


公司同事的項目整合jetty實現自啟動配置碰到困難,因此,花了點時間上網查了資料,進行了試驗,解決了網上資料中的一些坑,成功的將一個原有的工程改造成jetty自啟動工程。現錄如下。

原有的工程本身就是ssm+maven工程,因此,引入的工程包通過pom方式進行引入。ssm的配置方式不在本文闡述范圍,略。

1.改造pom.xml,加入字符編碼配置,否則代碼中有中文,后期用maven進行打包的時候會報錯。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>

2.在pom.xml中加入jetty依賴。

<properties>
  <jetty.version>9.0.2.v20130417</jetty.version>
</properties>
 

<dependencies>
  <!-- jetty -->
  <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jetty.version}</version>
      <!-- <scope>provided</scope> -->
  </dependency>

  <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-webapp</artifactId>
      <version>${jetty.version}</version>
  </dependency>
  <!-- jsp解析采用這個頁面會報錯,因此采用jsp-2.1-glassfish
  <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-jsp</artifactId>
      <version>${jetty.version}</version>
  </dependency>
  -->

  <!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jsp-2.1-glassfish -->
  <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jsp-2.1-glassfish</artifactId>
      <version>9.1.02.B04.p0</version>
  </dependency>
</dependencies>


這里的坑就是jsp包,采用jetty-jsp,在win下啟動的時候打開jsp頁面會報
PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required
但是本地的JAVA_HOME設置,PATH設置都是正確的,最后換了glassfish的包問題才得到解決。

3.啟動類編寫
package com.musa.base;

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

import java.io.File;
import java.net.URL;
import java.security.ProtectionDomain;

public class Launcher {
    public static final int DEFAULT_PORT = 8080;
    public static final String DEFAULT_CONTEXT_PATH = "/jetty-demo";
    private static final String DEFAULT_APP_CONTEXT_PATH = "src/main/webapp";


    public static void main(String[] args) {

        runJettyServer(DEFAULT_PORT, DEFAULT_CONTEXT_PATH);

    }

    public static void runJettyServer(int port, String contextPath) {

        Server server = createJettyServer(port, contextPath);
        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                server.stop();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    public static Server createJettyServer(int port, String contextPath) {

        Server server = new Server(port);
        server.setStopAtShutdown(true);

        ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
        URL location = protectionDomain.getCodeSource().getLocation();
        String warFile = location.toExternalForm();

        WebAppContext context = new WebAppContext(warFile, contextPath);
        context.setServer(server);

        // 設置work dir,war包將解壓到該目錄,jsp編譯后的文件也將放入其中。
        String currentDir = new File(location.getPath()).getParent();
        File workDir = new File(currentDir, "work");
        context.setTempDirectory(workDir);

        server.setHandler(context);
        return server;

    }

    public static Server createDevServer(int port, String contextPath) {

        Server server = new Server();
        server.setStopAtShutdown(true);

        ServerConnector connector = new ServerConnector(server);
        // 設置服務端口
        connector.setPort(port);
        connector.setReuseAddress(false);
        server.setConnectors(new Connector[] {connector});

        // 設置web資源根路徑以及訪問web的根路徑
        WebAppContext webAppCtx = new WebAppContext(DEFAULT_APP_CONTEXT_PATH, contextPath);
        webAppCtx.setDescriptor(DEFAULT_APP_CONTEXT_PATH + "/WEB-INF/web.xml");
        webAppCtx.setResourceBase(DEFAULT_APP_CONTEXT_PATH);
        webAppCtx.setClassLoader(Thread.currentThread().getContextClassLoader());
        server.setHandler(webAppCtx);

        return server;
    }
}

4.配置maven打包插件

<build>
        <finalName>jetty-demo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <target>1.7</target>
                    <source>1.7</source>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>main-class-placement</id>
                        <phase>prepare-package</phase>
                        <configuration>
                            <tasks>
                                <copy todir="${project.build.directory}/${project.artifactId}/">
                                    <fileset dir="${project.build.directory}/classes/">
                                        <include name="**/*/Launcher.class" />
                                    </fileset>
                                </copy>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.musa.base.Launcher</mainClass>
                                </transformer>
                            </transformers>
                            <artifactSet>
                                <includes>
                                    <include>org.eclipse.jetty:*</include>
                                    <include>*:javax.servlet*</include>
                                    <include>org.glassfish:javax.el*</include>
                                </includes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <descriptors> <!--描述文件路徑 -->
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

這里的關鍵是配置maven-assembly-plugin這個插件,configuration應放置到plugin下,如果放到execution里,打包時會一直報找不到配置文件的錯誤。

其中maven-shade-plugin插件用於將特定的第三方依賴追加到將要編譯打包的jar里面(or war),使得該jar成為可運行的jar(or war)。
<mainClass>指向main函數所在的類,在該項目中為Launcher類。<artifactSet>的<includes>里面指定需要整合到jar里面的第三方依賴庫。

另外,由於項目為web項目,打成war包的時候Launcher類所在的目錄為/WEB-INF/class下,我們需要將它移動到war包根目錄,因此我們使用maven-antrun-plugin插件來完成這個需求

5.打包

打包是通過maven-assembly-plugin實現,插件通過讀取配置文件進行打包操作。配置文件assembly.xml配置如下。

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>standalone</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>

    </dependencySets>
    <files>
        <file>
            <source>target/${project.artifactId}.war</source>
            <outputDirectory>\</outputDirectory>
        </file>
    </files>
    <fileSets>
        <fileSet>
            <directory>src\main\assembly\bin</directory>
            <outputDirectory>\bin</outputDirectory>
            <includes>
                <include>start.sh</include>
            </includes>
            <fileMode>0755</fileMode>
            <lineEnding>unix</lineEnding>
        </fileSet>
        <fileSet>
            <directory>src\main\assembly\bin</directory>
            <outputDirectory>\bin</outputDirectory>
            <includes>
                <include>start.bat</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

6.maven打包並運行。

到這這步,進入工程根目錄,調出cmd,執行mvn clean package,打包后會在本地形成jetty-demo.war和jetty-demo-standalone.zip,其實只需要jetty-demo.war就行了。

在jetty-demo.war所在目錄執行java -jar jetty-demo.war,程序走起~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM