我有一个简单的结构:一个包含一批数据的数据jar文件,以及一个使用该数据运行服务的服务jar文件。为了使数据易于替换,我将它们分开,service.jar的classpath包含data.jar所在的目录。
在service.jar中,我使用getResource加载数据文件。如果数据文件直接位于文件夹中,则此方法有效,但当它们位于data.jar;
内时,则会失败这失败了:
all
+ globalclasspath
| + data.jar
| + mine.properties
+ daemons
+ service.jar
jsvc -cp globalclasspath:daemons/service.jar (...)
MyClass.class.getClassLoader( ).getResource( "mine.properties" ); // <-- null
但这有效:
all
+ globalclasspath
| + mine.properties
+ daemons
+ service.jar
jsvc -cp globalclasspath:daemons/service.jar (...)
MyClass.class.getClassLoader( ).getResource( "mine.properties" ); // <-- not null
我不想更改类路径(除非我可以将其更改为通用的,不依赖于数据jar文件的名称),但我可以更改getResource字符串(我是尝试/data/mine.properties和/data.jar/mine.properties无济于事。我可以进行更改,以便可以从jar中加载资源吗?
答案 0 :(得分:5)
解决方案1
使用类路径通配符。
jsvc -cp globalclasspath/*:daemons/service.jar (...)
请参阅“How to use a wildcard in the classpath to add multiple jars?”
解决方案2
要读取不在类路径上的JAR中的数据,请使用URLClassLoader
。一般算法是这样的:
globalclasspath
目录中找到JAR列表。URLClassLoader
。URLClassLoader
实例中查找所需的资源。要在类路径中查找JAR,我使用了StackOverflow文章“ResourceList
”中的Get a list of resources from classpath directory。
public class MyClass {
/**
* Creates a {@code URLClassLoader} from JAR files found in the
* globalclasspath directory, assuming that globalclasspath is in
* {@code System.getProperty("java.class.path")}.
*/
private static URLClassLoader createURLClassLoader() {
Collection<String> resources = ResourceList.getResources(Pattern.compile(".*\\.jar"));
Collection<URL> urls = new ArrayList<URL>();
for (String resource : resources) {
File file = new File(resource);
// Ensure that the JAR exists
// and is in the globalclasspath directory.
if (file.isFile() && "globalclasspath".equals(file.getParentFile().getName())) {
try {
urls.add(file.toURI().toURL());
} catch (MalformedURLException e) {
// This should never happen.
e.printStackTrace();
}
}
}
return new URLClassLoader(urls.toArray(new URL[urls.size()]));
}
public static void main(String[] args) {
URLClassLoader classLoader = createURLClassLoader();
System.out.println(classLoader.getResource("mine.properties"));
}
}
我运行了以下命令:
java -cp globalclasspath:daemons/service.jar MyClass
终端输出:
jar:file:/workspace/all/globalclasspath/data.jar!/mine.properties
答案 1 :(得分:1)
您是否按照此处的建议尝试了getResourceAsStream
: