【问题标题】:Access files within resource directory in maven generated jar访问maven生成的jar中资源目录中的文件
【发布时间】:2019-05-18 13:22:04
【问题描述】:

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

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

但是现在,我想把它打包成一个罐子。这对我来说有点麻烦。这是我在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)

【问题讨论】:

    标签: java maven jar maven-plugin


    【解决方案1】:

    您不能将内部 jar 资源视为常规文件,您需要让 classloader 为您执行此操作,并且路径将相对于 jar 的顶层(所以您只想让 classloader 加载“MOCK_DATA. json" 没有任何路径),或 /resources 文件夹。这是怎么做的:

    Classpath resource within jar

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

    【讨论】:

    • 我尝试不通过 maven 插件处理资源文件夹,但它们没有放在资源目录中。所以我只想澄清一下,MOCK_DATA.json 应该在资源文件夹下,然后删除我的 pom 中的maven-resources-plugin 工件,然后使用类加载器?我正在尝试这个,但它不起作用。 ClassLoader 找不到我的MOCK_DATA.json
    • 按我说的做。我现在使用 getClass().getClassLoader().getResourceAsStream。现在好了。
    • @RigoSarmiento 关于资源插件我想说的是:当资源在项目中的 /src/main/resources 中时,您不需要声明插件,因为这是默认插件。除非你想要一些特定的插件配置。如果您想要额外的资源目录或将路径更改为其他内容,则需要插件配置
    【解决方案2】:

    如果您尝试从 .jar 中读取,那么

    new File("./src/main/resources/MOCK_DATA.json"

    不会工作。相反,您需要 Class.getResourceAsStream() 或等效项。

    这是一个例子:

    https://www.tutorialspoint.com/java/lang/class_getresourceasstream.htm

      ...
      try {
         // input stream
         InputStream is = this.getClass().getResourceAsStream(MY-RESOURCE);
         BufferedReader br = new BufferedReader(new InputStreamReader(is));
        ...
         is.close();
      } catch(Exception e) {
         System.out.println(e);
      }
    

    这里有一些额外的细节:How getClassLoader().getResourceAsStream() works in java

    【讨论】:

    • 您的解决方案更加清晰。谢谢!
    猜你喜欢
    • 2016-12-03
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多