Java 从另一个jar文件访问资源

Java 从另一个jar文件访问资源,java,classpath,jsvc,Java,Classpath,Jsvc,我有一个简单的结构:一个包含一批数据的数据jar文件和一个使用该数据运行服务的服务jar文件。为了便于替换数据,我将它们分开,service.jar的类路径包含data.jar所在的目录 在service.jar中,我使用getResource加载数据文件。如果数据文件直接位于文件夹内,则此操作有效,但当数据文件位于data.jar内时失败 这失败了: all + globalclasspath | + data.jar | + mine.properties + daemons + s

我有一个简单的结构:一个包含一批数据的数据jar文件和一个使用该数据运行服务的服务jar文件。为了便于替换数据,我将它们分开,service.jar的类路径包含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
全部
+全局路径
|+data.jar
|+矿地产
+守护进程
+service.jar
jsvc-cp globalclasspath:daemons/service.jar(…)

MyClass.class.getClassLoader().getResource(“mine.properties”);// 您是否按照此处的建议尝试过
getResourceAsStream


解决方案1

使用类路径通配符

jsvc -cp globalclasspath/*:daemons/service.jar (...)
见“

解决方案2

要读取JAR中不在类路径上的数据,请使用。一般算法如下:

  • globalclasspath
    目录中查找JAR列表
  • 从这个JAR列表创建一个
    URLClassLoader
  • URLClassLoader
    实例中查找所需的资源
  • 为了在类路径上查找JAR,我使用了StackOverflow文章中的“”

    终端输出:

    jar:file:/workspace/all/globalclasspath/data.jar!/mine.properties
    

    很抱歉,我实际上已经在使用
    getresourceastream
    (我写了
    getResource
    ,因为我不知道有什么不同,它看起来更简单)
    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