Доступ к файлам в каталоге ресурсов в сгенерированном maven jar - PullRequest
0 голосов
/ 18 декабря 2018

Я провел свое исследование, но просто не могу заставить его работать.Я использую 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>>() {});

Так вот с этим,Я могу получить доступ к 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)

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Если вы пытаетесь читать из .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);
  }

Вот некоторые дополнительные сведения: Как getClassLoader() .getResourceAsStream () работает в java

0 голосов
/ 18 декабря 2018

Вы не можете рассматривать внутренний ресурс jar как обычный файл, вам нужно попросить загрузчик классов сделать это за вас, и путь будет относительным к верхнему уровню jar (так что вы просто хотите попросить загрузчик классов загрузить "MOCK_DATA".JSON "без каких-либо путей), или в папку / resources.Вот как это сделать:

Ресурс Classpath в jar

BTW.Папка / src / main / resources является автоматической в ​​maven, если вам не нужно настраивать фильтрацию и т. д., кроме значений по умолчанию:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...