1.jar包与war包部署的区别
什么是jar包?
jar包是类的归档文件,jar文件格式以流行的ZIP文件格式作为基础,和ZIP文件不一样的是,JAR文件不仅仅用来进行压缩和发布,还用来部署和封装库、组件以及插件程序,并且,还能够被像编译器以及JVM这样的工具直接使用。jar包当中的com里面放的是class文件,配置文件,可是没有静态资源文件,大部分的jar中含有一个META-INF目录,用来存储包和扩展的配置数据,例如,安全性和版本信息。
什么是war包?
war包是JavaWeb程序打的包,war包当中包含写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。可以将一个war包理解成一个web项目,里面是项目的所有东西。war包当中的WEB-INF里放的class文件和配置文件,META-INF和jar包作用一样,war包里面还包含静态资源文件。
jar包和war包的不同之处?
(1)war包和项目的文件结构保持一致,而jar包和项目却不一样;
(2)jar包里面没有静态资源的文件。
jar包和war包部署项目的区别
部署普通的spring项目用war包即可。
2.jar包部署后路径访问失败问题
常见的访问项目路径下文件的方法如下:
String path = this.getClass().getClassLoad().getResource("").getPath() + "report/***.docx;
File file = new File(path);
这种编程方式在本地运行项目时可以正确执行,但是在jar包部署运行的情况下,会报如下错误, 提示访问不到jar包下的文件:
3.jar包部署后路径访问失败问题的解决办法
引入三个包:
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.ResourceUtils;
调用PathMatchingResourcePatternResolver.getResources(ResourceUtils.CLASSPATH_URL_PREFIX + filePath)方法获取jar包指定目录的Resources数组,再获取数组中每个Resource的字节输入流,将其从jar包中复制到运行环境的指定路径中。
public static void getResourceAndCopy(String filePath) throws IOException {
String dest = configLoadUtil.getProperties("/config.properties", "report.storagePath") + "static/";
File destFile = new File(dest);
if (!destFile.exists()) {
destFile.mkdirs();
}
Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceUtils.CLASSPATH_URL_PREFIX + filePath);
for(Resource resource : resources) {
InputStream is = resource.getInputStream();
//创建新的文件,保存复制内容,文件名称与源文件名称一致
File dfile = new File(dest + resource.getFilename());
if (!dfile.exists()) {
dfile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(dfile);
// 读写数据
// 定义数组
byte[] b = new byte[1024];
// 定义长度
int len;
// 循环读取
while ((len = is.read(b)) != -1) {
// 写出数据
fos.write(b, 0, len);
}
//关闭资源
fos.close();
is.close();
}