什么是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包即可。
常见的访问项目路径下文件的方法如下:
- String path = this.getClass().getClassLoad().getResource("").getPath() + "report/***.docx;
- File file = new File(path);
这种编程方式在本地运行项目时可以正确执行,但是在jar包部署运行的情况下,会报如下错误, 提示访问不到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();
- }