java 如何在可执行 jar 文件中捆绑配置文件
How to bundle configuration files in an executable jar file in java
我想将一些配置文件包含到我的可执行 jar 文件中,但是从 ecliplse 我似乎无法这样做。在创建 jar 时没有添加本地文件的选项。尝试这样做的目的是使默认配置文件在调用 jar 的任何地方都可用,而不是从其源位置。例如,如果我使用相对路径从不同位置调用一个 jar,即使它位于 jar 位置本身,配置也不会被执行。因此,每次我想要 运行 可执行文件时,我都必须从其源位置调用 jar。想要通过在 jar 本身中捆绑配置(在这种情况下是一个文本文件)来解决这个问题。有人能帮帮我吗?如果这不是直接可能的,那么在这种情况下有什么解决方法?我确定有些软件使用与自身捆绑的默认配置。我是论坛的新手,所以如果有人想更正问题中的任何文本或改进它,欢迎。
大概您想要 jar 本身内的文本文件。
我如何从我的 java 代码中读取该文本文件?
假设您的 jar 看起来像这样(假设我们设法以某种方式将文本文件放入其中):
jar tvf Arunavo.jar
439 Wed Sep 26 20:45:34 CEST 2019 com/arunavo/main/default-config.json
1439 Wed Sep 26 21:40:34 CEST 2019 com/arunavo/main/Main.class
然后,在你的 Main.java
文件中,你会写:
try (InputStream in = Main.class.getResourceAsStream("default-config.json")) {
String data = new String(in.readAllBytes(), StandardCharsets.UTF_8);
// do something with your config here...
System.out.println(data);
}
之所以可行,是因为 default-config.json
与 Main.class 位于同一 'folder' 中。如果你想从罐子的 'root' 开始,你会这样做: .getResourceAsStream("/com/arunavo/main/default-config.json")
这也可以。
然后我如何在我的 jar 中获取该文本文件?
通常,在项目配置中标记为 'source folder' 的任何文件夹中的任何文件都会不断 'compiles' eclipse。它通过编译 java 文件来编译它们。通过复制它 'compiles' 任何其他文件(非 class、非 java 文件)。所以.. 只需...将该配置文件放在 java 文件旁边。
请注意,使用 IDE 作为构建系统不是我(或任何人,真的)推荐的:它们只是不是构建系统。是的,eclipse 有一个 'export to jar' 特性,但它的功能非常有限。花一点时间了解如何使用 maven 或 gradle。这两者通常都使用以下目录结构:
src/main/java/com/arunavo/main/Main.java
src/main/resources/com/arunavo/main/default-config.json
maven(和 gradle,开箱即用),'compile' src/main/java
中的任何东西通过将它扔到 javac
和 'compile' 中的任何东西src/main/resources
通过复制。然后你可以告诉你的IDE这是一个maven(或gradle)项目,IDE会自动从那里获取它。
您总是可以 运行 jar tvf yourjar.jar
并检查配置文件是否在正确的位置,以检查您的构建是否通过 eclipse 的导出功能或 mvn/gradle,做得对。
注意:如果您正确设置了 eclipse,那么将配置文件放在 Main.java
用于普通 eclipse 项目的相同位置,或者如果它是一个适当的 src/main/resources/com/arunavo/main
目录maven-java 项目,然后 运行 在 eclipse 中使用例如 运行ning 你的应用程序调试器会发现配置文件很好。
我想将一些配置文件包含到我的可执行 jar 文件中,但是从 ecliplse 我似乎无法这样做。在创建 jar 时没有添加本地文件的选项。尝试这样做的目的是使默认配置文件在调用 jar 的任何地方都可用,而不是从其源位置。例如,如果我使用相对路径从不同位置调用一个 jar,即使它位于 jar 位置本身,配置也不会被执行。因此,每次我想要 运行 可执行文件时,我都必须从其源位置调用 jar。想要通过在 jar 本身中捆绑配置(在这种情况下是一个文本文件)来解决这个问题。有人能帮帮我吗?如果这不是直接可能的,那么在这种情况下有什么解决方法?我确定有些软件使用与自身捆绑的默认配置。我是论坛的新手,所以如果有人想更正问题中的任何文本或改进它,欢迎。
大概您想要 jar 本身内的文本文件。
我如何从我的 java 代码中读取该文本文件?
假设您的 jar 看起来像这样(假设我们设法以某种方式将文本文件放入其中):
jar tvf Arunavo.jar
439 Wed Sep 26 20:45:34 CEST 2019 com/arunavo/main/default-config.json
1439 Wed Sep 26 21:40:34 CEST 2019 com/arunavo/main/Main.class
然后,在你的 Main.java
文件中,你会写:
try (InputStream in = Main.class.getResourceAsStream("default-config.json")) {
String data = new String(in.readAllBytes(), StandardCharsets.UTF_8);
// do something with your config here...
System.out.println(data);
}
之所以可行,是因为 default-config.json
与 Main.class 位于同一 'folder' 中。如果你想从罐子的 'root' 开始,你会这样做: .getResourceAsStream("/com/arunavo/main/default-config.json")
这也可以。
然后我如何在我的 jar 中获取该文本文件?
通常,在项目配置中标记为 'source folder' 的任何文件夹中的任何文件都会不断 'compiles' eclipse。它通过编译 java 文件来编译它们。通过复制它 'compiles' 任何其他文件(非 class、非 java 文件)。所以.. 只需...将该配置文件放在 java 文件旁边。
请注意,使用 IDE 作为构建系统不是我(或任何人,真的)推荐的:它们只是不是构建系统。是的,eclipse 有一个 'export to jar' 特性,但它的功能非常有限。花一点时间了解如何使用 maven 或 gradle。这两者通常都使用以下目录结构:
src/main/java/com/arunavo/main/Main.java
src/main/resources/com/arunavo/main/default-config.json
maven(和 gradle,开箱即用),'compile' src/main/java
中的任何东西通过将它扔到 javac
和 'compile' 中的任何东西src/main/resources
通过复制。然后你可以告诉你的IDE这是一个maven(或gradle)项目,IDE会自动从那里获取它。
您总是可以 运行 jar tvf yourjar.jar
并检查配置文件是否在正确的位置,以检查您的构建是否通过 eclipse 的导出功能或 mvn/gradle,做得对。
注意:如果您正确设置了 eclipse,那么将配置文件放在 Main.java
用于普通 eclipse 项目的相同位置,或者如果它是一个适当的 src/main/resources/com/arunavo/main
目录maven-java 项目,然后 运行 在 eclipse 中使用例如 运行ning 你的应用程序调试器会发现配置文件很好。