项目打成jar包后获取不到不到resources下的文件

一个项目是分模块开发的,项目A是个工具包,没有第三方依赖,目录如下:

--src
    --main
        --java
        --resources
            --db
                --sqlite.db

A的一个函数功能就是将A的resources目录下的db/sqlite.db文件拷贝到指定的目录下

InpuStream is = this.getClass().getClassLoader().getResourceAsStream("/db/sqlite.db");
Files.copy(is,dirPath);

现有一个SpringBoot项目B,通过maven引入A
B在idea运行时A没有报错
B打包为jar包后,命令行运行A报错

获取到的InputStream为null,Files.copy报NPE

将B打包后的jar解压后,lib目录下的A.jar内是有文件的

这个路径究竟该如何获取?

"db/sqlite.db"和"/db/sqlite.db"都不行
this.getClass().getResourceAsStream("");
也都不行

用Guava的Resources工具也不好使,这种难不成写代码一套,打包一套吗?

A 的pom文件如下

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.db</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.db</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

B 的pom文件如下,由于Parent是自己的项目,没有继承spring-boot-parent-starter,所以B的pom多写了些配置

<build>
    <finalName>access\_server</finalName>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.db</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.yml</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
                <include>**/*.db</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.gree.hvac.access.AccessApplication</mainClass>
                <classifier>boot</classifier>
                <layout>ZIP</layout>
                <executable>true</executable>
                <excludeDevtools>true</excludeDevtools>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
阅读 9.8k
1 个回答

不确定是不是Maven插件版本问题。

以下方式是没问题的

读取当前的 jar的资源 或 如果是Springboot读取其他jar里面的资源:

InpuStream is = this.getClass().getClassLoader().getResourceAsStream("db/sqlite.db");

我的 A:

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.4</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>

    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.db</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>

B:

 <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.gree.hvac.access.AccessApplication</mainClass>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

供你参考。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题