2016-05-05 53 views
0

我试图编写一个Java 1.7应用程序,可以从命令行传递任意文件。该文件将被添加到ClassLoader中,以便它可以被用作资源。使用文件作为URLClassLoader的资源

将该文件添加到URLClassLoader似乎可行,但是如何在添加到ClassLoader后将该文件作为资源获取?

import java.io.File; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.Arrays; 

public class ClassLoaderTest { 

    public static void main(String... args) throws MalformedURLException { 

    File file = new File("/tmp/application.conf"); 
    URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()}); 
    System.out.println("ClassLoader URLs: " + Arrays.toString(classLoader.getURLs())); 

    if (file.exists()) { 
     System.out.println("File \"" + file.getAbsolutePath() + "\" exists!"); 
    } else { 
     System.out.println("File \"" + file.getAbsolutePath() + "\" does not exist!"); 
     return; 
    } 

    URL url = classLoader.getResource(file.getAbsolutePath()); 

    System.out.println("File \"" + file.getAbsolutePath() + "\" as url: " + url); 

    assert url != null; 

    } 
} 
+0

为什么你需要使用ClassLoader?当资源与已知类位于同一目录中时,这很有用,但如果您只是想打开文件并使用它,则不需要使用除URL和文件以外的其他任何内容。 –

+0

@PaulHicks这将被集成到期望从初始化时提供的ClassLoader中检索资源。 –

+1

我注意到你的文件不是jar。 'URLClassLoader'只能用于罐子和罐子目录。您可以将您的conf文件放入jar中,也可以实现自己的类加载器。 –

回答

2

URLClassLoader仅支持jar文件和文件目录。所以有两种选择:

  1. 把你的资源放到一个jar文件中,然后把那个jar文件加入你的URLClassLoader
  2. 将目录提供给类加载器,并使用该目录中文件的相对路径。
+0

并使用以JAR根为根的路径,而不是绝对路径名。 '只有JAR文件和JAR文件的目录'不正确。如果你命名一个目录,它会在目录和包结构重合的情况下找到它内部或下面的.class文件和资源。 – EJP

+0

添加目录,然后通过文件名得到资源完美地工作。谢谢你的帮助。 –