springboot打包成jar运行无法访问resources下的资源,以及jar包运行时引用的第三方jar包也无法加载

最近碰到个问题,就是项目打包成jar包运行无法访问resources里的资源。jar包运行时引用的第三方jar包也无法加载。

就是我需要实现一个导出成pdf或者word文档的功能,导出这两种文档是根据模板来导出。先准备好了pdf和word的模板,导出时将数据内容填充到模板中,然后再将填写好内容的pdf或word文档下载下来。

这两种模板我是放在 resources 目录下 template 文件夹里
在这里插入图片描述
读取模板时,我是用 ClassLoader.getSystemResource(“template”).getPath() 来读取的,具体代码如下:

/**
  * @param dataMap 导出数据
  * @param templateName 模板名称
  * @param path 导出word的路径以及文件名称
  * 通过模板导出word格式文件
  * */
 public static void exportWord(Map<String,Object> dataMap,String templateName,String path) throws IOException, TemplateException {
     //Configuration 用于读取ftl文件
     Configuration configuration = new Configuration(new Version("2.3.0"));
     configuration.setDefaultEncoding("utf-8");

     /**
      * 以下是两种指定ftl文件所在目录路径的方式,注意这两种方式都是
      * 指定ftl文件所在目录的路径,而不是ftl文件的路径
      */
     configuration.setDirectoryForTemplateLoading(new File(ClassLoader.getSystemResource("template").getPath()));
     System.out.println("模板路径=====>>>>>>>>>>>"+new File(ClassLoader.getSystemResource("template").getPath()));
     //输出文档路径及名称
     File outFile = new File(path);
     //以utf-8的编码读取ftl文件
     Template template = configuration.getTemplate(templateName, "utf-8");
     Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
     template.process(dataMap, out);
     out.close();
 }

以上代码读取模板,在本地运行的时候是没有问题,但是把这个项目打包成jar包后,部署到服务器运行,导出word或pdf文件的时候,就报错了,看错误信息,是 configuration.setDirectoryForTemplateLoading(new File(ClassLoader.getSystemResource(“template”).getPath())); 这一句报错了。

其实就是 ClassLoader.getSystemResource(“template”).getPath() 这里获取模板路径的时候没有获取到,为null,所以报错了,然后我换了种方法获取路径,根据某个类的相对路径来获取:

//这里要注意前面要加“/”,即"/template",如果直接用 "template" 也是获取不到的
configuration.setClassForTemplateLoading(this.getClass(),"/template");

改好之后果然可以了,然鹅并没结束,这里我导出word是没问题了,可是我导出pdf还是有问题。

因为我这里导出成pdf是先将数据填写到word模板中,然后再将这个模板转为pdf进行下载。

word转pdf就用到了一个第三方jar包,aspose-words-15.8.0.jar
在这里插入图片描述
用这个jar包,将word转为pdf,在pom.xml中需要配置:

<!--引入word转pdf jar包-->
<dependency>
	<groupId>aspose</groupId>
	<artifactId>words</artifactId>
	<version>15.8.0</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/jar/aspose-words-15.8.0.jar</systemPath>
</dependency>

这样在本地运行是没有问题的,但是打包成jar运行就不行,后面找了半天终于找到解决办法,在pom.xml打包成jar的配置中,加上 < includeSystemScope>true</ includeSystemScope> 这句即可:

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<includeSystemScope>true</includeSystemScope>
	</configuration>
</plugin>

这样就大功告成,打包jar,运行,导出word和pdf都没问题。

关于引用的第三方jar包,其实也可以将第三方jar包导入到本地的maven仓库,在pom里引入的时候,像引入其他依赖一样就可以了,在将项目打包成jar包的时候,pom里面也不用配置 < includeSystemScope>true</ includeSystemScope>

第三方外部jar包转成maven本地仓库的jar包

打开cmd,输入以下命令,就可以将外部jar包转到maven本地仓库,然后引入的时候,像其他依赖一样引入就行,打包也会像其他依赖一样一起打包。

mvn install:install-file -Dfile=C:\Users\Admin\Desktop\aspose-words-16.8.0.jar -DgroupId=aspose -DartifactId=words -Dversion=16.8.0 -Dpackaging=jar

-Dfile=C:\Users\Admin\Desktop\aspose-words-16.8.0.jar 这里是外部jar包存放的路径。

<!--引入word转pdf jar包-->
<dependency>
    <groupId>aspose</groupId>
    <artifactId>words</artifactId>
    <version>16.8.0</version>
</dependency>

这里用到的 aspose-words-16.8.0.jar 包,我放在 这里 了,提取码是 3hwy,需要的自行下载。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Spring Boot时,可能会出现打JAR运行无法读取resources里的文件的问题。这是因为在JAR包中,资源文件会被打包到一个压缩文件中,而不是一个文件夹中。 解决这个问题有几种方法: 1. 使用Classloader获取资源 可以使用JavaClassloader获取JAR包中的资源。这种方法可行,但较繁琐。 举个例子: ```java ClassLoader classLoader = getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("file.txt"); ``` 这样做可以读取位于JAR包中的file.txt文件。 2. 使用Spring提供的ResourceLoader Spring提供了ResourceLoader来处理此问题。我们可以注入ResourceLoader并使用它读取资源。 举个例子: ```java @Autowired private ResourceLoader resourceLoader; public void readFile() throws IOException { Resource resource = resourceLoader.getResource("classpath:file.txt"); InputStream inputStream = resource.getInputStream(); } ``` 这个方法还可以处理其他类型的资源,例如网络资源等。 3. 使用FileSystemResource 我们可以使用FileSystemResource来读取文件。这种方法需要JAR包解压到文件夹中,然后使用FileSystemResource来读取文件。 ```java Resource resource = new FileSystemResource(file.txt); InputStream inputStream = resource.getInputStream(); ``` 但是这种方法会使JAR包无法单独使用。 总之,以上三种方法都可以解决打JAR运行无法读取resources里的文件的问题,我们可以根据实际情况选择其中一种方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值