java - 访问maven生成的jar中资源目录中的文件

标签 java maven jar maven-plugin

我已经完成了研究,但我真的无法让它发挥作用。 我正在使用 Spring Boot 和 Maven。我的前端使用 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>>() {});

这样,我就可以访问 resources 目录下的 MOCK_DATA.json 了。

但是现在,我想将它打包到一个 jar 中。这对我来说有点麻烦。这是我在 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 (没有这样的文件或目录)

最佳答案

您不能将内部 jar 资源视为常规文件,您需要要求类加载器为您执行此操作,并且路径将相对于 jar 的顶层(因此您只想要求类加载器加载“MOCK_DATA.jar”)。 json”,没有任何路径),或/resources 文件夹。操作方法如下:

Classpath resource within jar

顺便说一句。/src/main/resources 文件夹在 Maven 中是自动的,除非您需要配置过滤等默认值:)

关于java - 访问maven生成的jar中资源目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53827709/

相关文章:

java - 对 EditText 中的数据执行数值计算时出错

java - 如何从 ebuild 链接到 Maven 源 jar

java - Maven - 使用父项目中的程序集文件和配置

java - 在 linux javac 上编译 Java - Jar 文件顺序失败

java -xbootclass path 不再是受支持的选项

java - 您是否应该为 Java 枚举定义一个空值/未知值?

java - 通知 MySQL 的变化

java - 如何从 Google Cloud 上运行的 Java 应用安全地引用 .json 私钥文件

java - ClassNotFoundException oracle.jdbc.driver.OracleDriver

java - hadoop NoClassDefFoundError 尽管 DistributedCache 设置