SpringBoot + JSP项目打包成jar后 JSP页面404的解决方案

问题背景

最近从同学那里拿来一个 Spring Boot + JSP 的项目,在本地环境正常运行后,想要部署到服务器去跑一下,不料在打包为jar包后,去使用java -jar xxxxxx.jar 命令运行时,发现不能正常运行。

我们都知道Spring Boot 官方并不推荐使用JSP,Spring Boot 推荐模板引擎:

  • Thymeleaf

  • Freemarker

  • Mustache

  • Groovy Templates

因为在打包的jar包里面默认是没有JSP资源的,需要在pom文件中进行一些配置,在这里进行记录一下。

解决方案

因为项目中,使用了JSP作为页面模板,但是SpringBoot 对于JSP又不友好,所以需要添加以下jsp相关依赖:

<!-- 使用jsp引擎,springboot内置tomcat没有此依赖 -->
<!--内置tocat对jsp支持的依赖,用于编译jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
     <scope>provided</scope>
</dependency>

<!-- 添加jstl标签库依赖模块 -->
<!-- JavaServer Pages Standard Tag Library,JSP标准标签库 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

scope(作用域)值列表代表含义解释如下:

  • compile(默认值): 表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

  • test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit。

  • runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。

  • provided:打包不会包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作。

  • system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径。

以上依赖坐标是基本的,最关键的还是后面的build需要指定jsp页面的位置,也就是通过插件把jsp页面也打包进jar。 需要注意配置主类路径,jsp正确的路径,resource。

首先添加如下依赖坐标:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.4.2.RELEASE</version>
</dependency>

然后配置插件和指定资源文件的位置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.4.2.RELEASE</version>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
                <fork>true</fork>
                <addResources>true</addResources>
                <mainClass>com.aaa.DemoJspApplication</mainClass><!--主类的路径-->
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <!-- 指定资源文件的位置,否则maven打包的时候不会jsp页面打包进jar -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/webapps</directory>
            <targetPath>META-INF/resources</targetPath>
            <includes>
                <include>**/**</include>
            </includes>
        </resource>
    </resources>
</build>

经过以上操作,然后使用Maven项目构建工具进行打包即可。注意:在打包之前可以先进行清除操作。

Linux后台运行Jar

方法一:

$ nohup java -jar test.jar &

//nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
//当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中
//除非另外指定了输出文件。

方法二:

$ nohup java -jar test.jar >temp.txt &

//这种方法会把日志文件输入到你指定的文件中,没有则会自动创建

列出所有后台执行的作业:

 $ jobs
 //那么就会列出所有后台执行的作业,并且每个作业前面都有个编号。
 //如果想将某个作业调回前台控制,只需要 fg + 编号即可。
 $ fg 2

查看某端口占用的线程的pid:

 netstat -nlp |grep :8080

微信关注

                     编程那点事儿

阅读剩余
THE END