java - 访问maven生成的jar中资源目录中的文件
问题描述
我已经完成了我的研究,但我真的无法让它发挥作用。我正在使用带有 Maven 的 Spring Boot。Thymeleaf 和 jquery 用于我的前端。
我的目录:
project-system/
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── rigor
│ │ │ └── io
│ │ │ └── projectsystem
│ │ │ ├── rush
│ │ │ │ ├── TemporaryController.java
│ │ │ └── ProjectSystemApplication.java
│ │ └── resources
│ │ ├── application.properties
│ │ ├── MOCK_DATA.json
│ │ ├── static
│ │ └── templates
│ │ ├── index.html
│ │ └── records.html
在里面TemporaryController
,我正在做这个操作:
list = new ObjectMapper().readValue(new File("./src/main/resources/MOCK_DATA.json"), new TypeReference<List<POJO>>() {});
所以有了这个,我就可以访问目录MOCK_DATA.json
下的了resources
。
但是现在,我想把它打包成一个罐子。这对我来说有点麻烦。这是我的pom
文件中的构建:
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes/src/main</outputDirectory>
<includeEmptyDirs>true</includeEmptyDirs>
<resources>
<resource>
<directory>${basedir}/src/main/</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>rigor.io.projectsystem.ProjectSystemApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
这给我的结果target
目录是:
├── target
│ ├── classes
│ │ ├── application.properties
│ │ ├── MOCK_DATA.json
│ │ ├── rigor
│ │ │ └── io
│ │ │ └── projectsystem
│ │ │ ├── rush
│ │ │ │ ├── TemporaryController.class
│ │ │ └── ProjectSystemApplication.class
│ │ ├── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ │ └── rigor
│ │ │ │ └── io
│ │ │ │ └── projectsystem
│ │ │ │ ├── rush
│ │ │ │ │ ├── TemporaryController.java
│ │ │ │ └── ProjectSystemApplication.java
│ │ │ └── resources
│ │ │ ├── application.properties
│ │ │ ├── MOCK_DATA.json
│ │ │ ├── static
│ │ │ └── templates
│ │ │ ├── index.html
│ │ │ └── records.html
│ │ └── templates
│ │ ├── index.html
│ │ └── records.html
│ ├── generated-sources
│ │ └── annotations
│ ├── generated-test-sources
│ │ └── test-annotations
│ ├── maven-archiver
│ │ └── pom.properties
│ ├── maven-status
│ │ └── maven-compiler-plugin
│ │ ├── compile
│ │ │ └── default-compile
│ │ │ ├── createdFiles.lst
│ │ │ └── inputFiles.lst
│ │ └── testCompile
│ │ └── default-testCompile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ ├── surefire-reports
│ │ ├── rigor.io.projectsystem.ProjectSystemApplicationTests.txt
│ │ └── TEST-rigor.io.projectsystem.ProjectSystemApplicationTests.xml
│ ├── test-classes
│ │ └── rigor
│ │ └── io
│ │ └── projectsystem
│ │ ├── ProjectSystemApplicationTests$1.class
│ │ └── ProjectSystemApplicationTests.class
│ ├── project-system-0.0.1-SNAPSHOT.jar
│ └── project-system-0.0.1-SNAPSHOT.jar.original
如您所见,发生了一些冗余,当我尝试运行 jar 文件时,它给了我一个java.io.FileNotFoundException: ./src/main/resourfces/MOCK_DATA.json (No such file or directory)
解决方案
您不能将内部 jar 资源视为常规文件,您需要让类加载器为您执行此操作,并且路径将相对于 jar 的顶层(所以您只想让类加载器加载“MOCK_DATA.json”而不任何路径),或 /resources 文件夹。这是如何做到的:
顺便提一句。/src/main/resources 文件夹在 Maven 中是自动的,除非您需要配置过滤等而不是默认值:)
推荐阅读
- javascript - URL位置有人可以解释吗?
- prolog - 如何在 Prolog 中打印 dynamic/1
- javascript - 通过 params 中传递的任何字段查找数据库用户
- java - Java 类不必匹配源文件中编写的包
- algorithm - 在每次调用的范围内获取唯一的随机数
- powershell - 在 Powershell 中从 PC 名称获取 UPN
- linux - 如何在树莓派上成功运行 valgrind(callgrind)?
- attributes - 如何在 Magento 2 中同步两个产品属性?
- excel - 查找功能未按预期在所有工作表中工作
- ios - 使用 UICollectionLayoutListConfiguration 的特定部分的部分标题