• jar包与war包部署的区别及jar包部署的一个路径访问问题


    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包部署后路径访问失败问题

    常见的访问项目路径下文件的方法如下:

    1. String path = this.getClass().getClassLoad().getResource("").getPath() + "report/***.docx;
    2. 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包中复制到运行环境的指定路径中。

    1. public static void getResourceAndCopy(String filePath) throws IOException {
    2. String dest = configLoadUtil.getProperties("/config.properties", "report.storagePath") + "static/";
    3. File destFile = new File(dest);
    4. if (!destFile.exists()) {
    5. destFile.mkdirs();
    6. }
    7. Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceUtils.CLASSPATH_URL_PREFIX + filePath);
    8. for(Resource resource : resources) {
    9. InputStream is = resource.getInputStream();
    10. //创建新的文件,保存复制内容,文件名称与源文件名称一致
    11. File dfile = new File(dest + resource.getFilename());
    12. if (!dfile.exists()) {
    13. dfile.createNewFile();
    14. }
    15. FileOutputStream fos = new FileOutputStream(dfile);
    16. // 读写数据
    17. // 定义数组
    18. byte[] b = new byte[1024];
    19. // 定义长度
    20. int len;
    21. // 循环读取
    22. while ((len = is.read(b)) != -1) {
    23. // 写出数据
    24. fos.write(b, 0, len);
    25. }
    26. //关闭资源
    27. fos.close();
    28. is.close();
    29. }
  • 相关阅读:
    基于JSP的员工绩效考核系统
    Oracle中ALTER TABLE的五种用法(三)
    如何在OneFlow中新增算子
    使用synchronized 加锁你加对了么?
    boost.regex正则表达式
    记录Windows下mysql更改my.ini文件中datadir路径后启动不起来的问题
    申请专利的好处!这份清单告诉你,为什么要申请专利?
    C理解(四):链表
    线上展厅怎么做要多长时间
    Terra-Luna归零一年后:信任重建、加密未来路在何方?
  • 原文地址:https://blog.csdn.net/jl08133341/article/details/126593909