读取jar/war文件中的maven.properties文件

发布于 2024-10-21 09:11:55 字数 127 浏览 2 评论 0原文

有没有办法用Java读取jar/war文件中的文件(maven.properties)的内容?当文件未使用时(在内存中),我需要从磁盘读取该文件。关于如何做到这一点有什么建议吗?

问候, 约翰-基斯

Is there a way to read the content of a file (maven.properties) inside a jar/war file with Java? I need to read the file from disk, when it's not used (in memory). Any advise on how to do this?

Regards,
Johan-Kees

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

分開簡單 2024-10-28 09:11:55
String path = "META-INF/maven/pom.properties";

Properties prop = new Properties();
InputStream in = ClassLoader.getSystemResourceAsStream(path );
try {
  prop.load(in);
} 
catch (Exception e) {

} finally {
    try { in.close(); } 
    catch (Exception ex){}
}
System.out.println("maven properties " + prop);
String path = "META-INF/maven/pom.properties";

Properties prop = new Properties();
InputStream in = ClassLoader.getSystemResourceAsStream(path );
try {
  prop.load(in);
} 
catch (Exception e) {

} finally {
    try { in.close(); } 
    catch (Exception ex){}
}
System.out.println("maven properties " + prop);
橘亓 2024-10-28 09:11:55

首先一件事:从技术上讲,它不是一个文件。 JAR / WAR 是一个文件,您要查找的是存档中的条目(也称为资源)。

因为它不是文件,所以您需要将其作为 InputStream

  1. 如果 JAR / WAR 位于
    classpath,您可以执行 SomeClass.class.getResourceAsStream("/path/from/the/jar/to/maven.properties"),其中 SomeClass 是其中的任何类JAR/战争

    // 这些是等效的:
    SomeClass.class.getResourceAsStream("/abc/def");
    SomeClass.class.getClassLoader().getResourceAsStream("abc/def");
    // 注意第二个版本中缺少的斜杠
    
  2. 如果没有,您将必须像这样阅读 JAR / WAR:

    JarFile jarFile = new JarFile(文件);
    输入流 输入流 =
        jarFile.getInputStream(jarFile.getEntry("path/to/maven.properties"));
    

现在您可能希望将 InputStream 加载到 Properties 对象中:

Properties props = new Properties();
// or: Properties props = System.getProperties();
props.load(inputStream);

或者您可以将 InputStream 读取为字符串。 这样的库,这会容易得多

  • 如果您使用像

    Apache Commons / IO

    String str = IOUtils.toString(inputStream)
    
  • Google Guava

    String str = CharStreams.toString(new InputStreamReader(inputStream));
    

One thing first: technically, it's not a file. The JAR / WAR is a file, what you are looking for is an entry within an archive (AKA a resource).

And because it's not a file, you will need to get it as an InputStream

  1. If the JAR / WAR is on the
    classpath, you can do SomeClass.class.getResourceAsStream("/path/from/the/jar/to/maven.properties"), where SomeClass is any class inside that JAR / WAR

    // these are equivalent:
    SomeClass.class.getResourceAsStream("/abc/def");
    SomeClass.class.getClassLoader().getResourceAsStream("abc/def");
    // note the missing slash in the second version
    
  2. If not, you will have to read the JAR / WAR like this:

    JarFile jarFile = new JarFile(file);
    InputStream inputStream =
        jarFile.getInputStream(jarFile.getEntry("path/to/maven.properties"));
    

Now you probably want to load the InputStream into a Properties object:

Properties props = new Properties();
// or: Properties props = System.getProperties();
props.load(inputStream);

Or you can read the InputStream to a String. This is much easier if you use a library like

狂之美人 2024-10-28 09:11:55

这绝对是可能的,尽管在不知道您的具体情况的情况下很难具体地说。

WAR 和 JAR 文件基本上都是 .zip 文件,因此如果您知道包含所需 .properties 文件的文件的位置,则可以使用 ZipFile 并提取属性。

如果它是一个 JAR 文件,可能有一种更简单的方法:您可以将其添加到类路径中并使用以下内容加载属性:(

SomeClass.class.getClassLoader().getResourceAsStream("maven.properties"); 

假设属性文件位于根包中)

This is definitely possible although without knowing your exact situation it's difficult to say specifically.

WAR and JAR files are basically .zip files, so if you have the location of the file containing the .properties file you want you can just open it up using ZipFile and extract the properties.

If it's a JAR file though, there may be an easier way: you could just add it to your classpath and load the properties using something like:

SomeClass.class.getClassLoader().getResourceAsStream("maven.properties"); 

(assuming the properties file is in the root package)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文