首先说明一下,为何jsp打入jar中仍能运行。
在Servlet3.0协议规范中指出:${jar}/META-INF/resources/被视为根目录。那么将jsp等静态资源打入META-INF/resources/目录下就与实际项目没有区别了。
在打jar的时候会自动生成META-INF目录,该目录的作用是:配置应用程序、扩展程序、类加载器和服务、manifest.mf文件。
maven打jar的时候会自动读取src/main/java和src/main/resources下的资源打成jar,那么我们可以利用这一机制将META-INF/resources目录放在src/main/resources资源文件夹下,再将需要打包的静态资源发到META-INF/resources目录下即可。
下面展示一个将jsp打入jar的例子。
1.module4项目是一个war项目,它依赖于module2项目,配置如下:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.my.module</groupId>
<artifactId>ModuleTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>module4</artifactId>
<packaging>war</packaging>
<name>module4 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.my.module</groupId>
<artifactId>module2</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>module4</finalName>
<plugins>
<!-- 定义编译版本为1.7,字符编码为utf8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<webappDirectory>src/main/webapp</webappDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.module2是一个jar项目,module2依赖于module1项目,pom.xml如下:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.my.module</groupId>
<artifactId>ModuleTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>module2</artifactId>
<name>module2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.my.module</groupId>
<artifactId>module1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>module2</finalName>
<plugins>
<!-- 定义编译版本为1.7,字符编码为utf8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.module2的jsp文件目录如下:
5.编译module2项目的结果如下:(可以发现jsp被打包带入了jar中)
6.启动项目访问module2.jsp结果如下:
7.注意:maven默认情况下是不会去jar中扫描action的,这需要我们手动在struts中配置哪些action的jar需要被扫描。