【问题标题】:Java read a file from jar which is in lib folder of a warJava从war的lib文件夹中的jar中读取文件
【发布时间】:2014-10-08 02:22:28
【问题描述】:

我有 Spring 应用程序,我试图从我的构建应用程序战争的 lib 文件夹中的 jar 中读取 xml 文件,即 /WEB-INF/lib/abc.jar。

现在我正在使用此代码。

InputStream reader = SomeClassInabcJars.class
                          .getResourceAsStream("/META-INF/spring/beans.xml");

在此之后,我使用 DOM 解析器从中获取所有 bean 标签。

如果我使用命令 mvn tomcat:run 部署此应用程序,我将得到正确的 beans.xml。但是如果我在tomcat中手动部署这个应用程序的war,那么beans.xml中似乎有一些新的bean标签,并且其中缺少一些bean标签。

如果我提取这场战争并打开那个 abc.jar 的 beans.xml,它似乎是正确的。我认为这个 beans.xml 在运行时会发生变化。

【问题讨论】:

  • 可能是它与tomcat的类路径不同,它在同一路径上有bean.xml。大多数 spring jar 在同一路径中都有 bean.xml。尝试先为 web-inf 库设置类路径

标签: java xml spring tomcat jar


【解决方案1】:

我找到了一个解决方案,可以从构建应用程序 war 文件的 lib 文件夹中的 jar 中读取任何文件,它对我有用。

InputStream reader = null;
for (URL url : ((URLClassLoader) (Thread.currentThread()
        .getContextClassLoader())).getURLs()) {
    if (url.getPath().contains("notification-engine")) {
        String inputFile = "jar:file:" + url.getPath()
                + "!/META-INF/spring/beans.xml";
        URL inputURL = null;
        try {
            inputURL = new URL(inputFile);
            JarURLConnection conn = (JarURLConnection) inputURL
                    .openConnection();
            reader = conn.getInputStream();
        } catch (MalformedURLException e1) {
            System.err.println("Malformed input URL: " + inputURL);
        } catch (IOException e1) {
            System.err.println("IO error open connection");
        }
        break;
    }

}

它从包含通知引擎的路径(它的 jar 路径)读取 /META-INF/spring/beans.xml 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多