0

我有一个标准的 Sprinb Boot 项目。

在文件夹中:src/main/resources/tmp/my_file.json,我有一个我在 Java 代码中读取的 json。


File file = new File("src/main/resources/tmp/my_file.json");

在本地运行时,它完美无缺

使用 Jib,我创建了一个 docker 映像:


<plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.5.2</version>
                <configuration>
                    <from>
                        <image>adoptopenjdk:11-jre-hotspot</image>
                    </from>
                    <to>
                        <image>xxx/my_project:${version}</image>
                    </to>
                    <container>
                        <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                    </container>
                </configuration>
            </plugin>

当我运行容器时,它给了我一个找不到文件的错误:

java.io.FileNotFoundException: src/main/resources/tmp/my_file.json (No such file or directory)

“src/main/resources”文件夹是静态资源的标准位置。

我应该向 Jib 添加任何额外的配置以使文件可用吗?

4

2 回答 2

0

问题不在于 Jib,而在于您的代码。
将“src/main/resources/”放在类路径上——这是一种标准方式。并修改您的代码如下:

File file = new File("tmp/my_file.json");

当 Jib 创建图像时,它会将所有资源从“src/main/resources/”复制到图像上的目录(“/app/resources”),并在启动应用程序时将该目录放在类路径中。

于 2021-01-13T16:30:09.810 回答
0

您不希望您的应用程序打开基于源项目结构的文件。在运行时(无论是打包为 JAR 文件还是容器映像),您将没有src/目录,并且new File("src/...")总是会失败。例如,即使在 Docker 上下文之外,假设您将应用程序打包为可运行的 jar。然后运行您的应用程序java -jar <your-runnable.jar>将因相同的错误而失败。

Java 人员通常做的是在类路径上搜索文件,这几乎是您想要实现的目标的标准方法。google "java get resources" 可以找到很多有用的资料,这里有一些参考资料:


截至目前,Jib 2.7.0 是最新的。

于 2020-12-10T16:18:48.463 回答