当前位置: 首页 > 知识库问答 >
问题:

如何从加载到java应用程序中的jar文件中加载资源?

穆阳嘉
2023-03-14
JarFile jar  = new JarFile(jar);
Enumeration<JarEntry> entries = jar.entries();

int URLsize = 1;
while (entries.hasMoreElements())
    if (entries.nextElement().getName().startsWith("foo/bar/foobar"))
        URLsize++;

entries = jar.entries();

URL[] urls = new URL[URLsize];
urls[0] = patch.toURI().toURL();

int count = 1;
while (entries.hasMoreElements())
{
    JarEntry nextElement = entries.nextElement();
    if (nextElement.getName().startsWith("foo/bar/foobar"))
    {               
        urls[count] = new URL("jar:file:/"+ jar.getAbsolutePath() + "!/" + nextElement.getName());

        count++;
    }
}
URLClassLoader loader = new URLClassLoader (urls);
Thread.currentThread().setContextClassLoader(loader);

Class<?> jarC = Class.forName ("foo.bar.barfoo.Main", true, loader);
Constructor<?> cons = jarC.getConstructor(String.class, String.class, Properties.class, Properties.class, String[].class);
Object instance = cons.newInstance (systemPath, programPath, config, some_data, args);

Method method = jarC.getMethod ("Main");

method.invoke (instance);
private static InputStream getResourceAsStream(String resource) {       
        try {       
            return Thread.currentThread().getContextClassLoader().getResource(resource).openStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
private static List<String> getResourceFiles(String path) throws IOException {
    List<String> filenames = new ArrayList<>();

    try (
            InputStream in = getResourceAsStream(path);
            BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;

        while ((resource = br.readLine()) != null) {
            filenames.add(resource);
        }
    }

    return filenames;
}

和调用GetResourceFiles方法的位置:

List<String> names = Foo.getResourceFiles("/foo/bar/foobar");

共有1个答案

赫连飞沉
2023-03-14

你为什么要做这些?为什么不直接向URLClassLoader添加到JAR的URL呢?

例如。

URLClassLoader loader = new URLClassLoader(new File(jar).toURI().toURL());

此外,您可能应该使URLClassLoader具有您当前的classloader作为父级,例如。

URLClassLoader loader = new URLClassLoader(new File(jar).toURI().toURL(), Thread.currentThread().getContextClassLoader());
 类似资料:
  • 我在maven项目的src/main/resource文件夹中下载了.sh文件,我正在通过下面的代码阅读它 如果我使用jar EX作为应用程序运行:- java-jar runscript.jar SCHEMA_NAME /users/ideaprojects/runscript/target/file:/users/ideaprojects/runscript/target/runscripts

  • 问题内容: 我需要从罐子中加载属性文件。该罐子包含在war文件中。这是结构 现在,我在一个servlet中编写了以下代码,如下所示: 但是上面的代码我得到流为空。如果我将属性文件放在ROOT.war / WEB- INF中,则可以正常工作。我有一个不错的主意,如果getResourceAsStream中的路径以“ /”开头,那么它将在上下文根目录中搜索资源。但是,如何读取位于jar的资源,该jar

  • 我试图显示包含从资源加载的帮助的chm文件: 从NetBeans运行项目时,帮助文件将正确显示。不幸的是,当程序从jar文件运行时,它不起作用;它会导致异常。 在我看来,URI描述的jar的内部结构还没有被认识到。。。还有更好的办法吗?例如,使用BufferReader类? BuffereImage类修复了jpg文件的类似问题 没有任何转换到URI。。。 谢谢你的帮助...

  • 问题内容: 我的项目具有以下结构: 我有一个文件,我想从单元测试中加载文件 我有此代码不起作用。它抱怨“没有这样的文件或目录”。 我也试过了 这也不起作用。它返回。我正在使用Maven构建我的项目。 问题答案: 尝试下一个: 如果上述方法不起作用,则已在以下类中添加了各种项目:1(代码在此处)。 以下是有关如何使用该类的一些示例:

  • 问题内容: 在我的应用程序中,我以这种方式加载资源: 这给了我: 当我从IDE运行我的应用程序时,但是当我运行应用程序的jar时,这可以很好地工作: 路径变为: 有什么办法解决这个问题? 我将使用“存储库”目录名称来创建此目录: 以相同的方式,我将获得一个文件名(而不是目录),并以这种方式使用它: 问题答案: 听起来你正在尝试使用或类似方法加载资源。不要那样做:不要调用,而是从中调用并读取数据。

  • 我有一个应用程序加载它的Spring上下文与XML配置。 上下文文件存储在jar的类路径中(在目录中)。 通过引入一个新bean,我想从同一存档的类路径中加载一个beanio映射文件。由于Tomcat在Eclipse中运行,这一切都很有吸引力,但当我将WAR文件部署到QA环境时,应用程序无法启动。 让我走代码: 然后是背景 然后呢?嗯...我已经通过首先解压war文件来双重检查构建的jar文件。都