Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在URLClassLoader中加载存储在应用程序资源中的JAR_Java_Maven_Jar_Dependencies - Fatal编程技术网

Java 如何在URLClassLoader中加载存储在应用程序资源中的JAR

Java 如何在URLClassLoader中加载存储在应用程序资源中的JAR,java,maven,jar,dependencies,Java,Maven,Jar,Dependencies,我试图在URLClassLoader中加载一个JAR文件。这个JAR文件存储在我的项目的资源中,当我使用maven运行我的项目时,它与以下代码配合良好: new URLClassLoader( new URL[]{MyClass.class.getClassLoader().getResource("dependencies/dependency.jar")}, ClassLoader.getSystemClassLoader().getParent() ); 但是,当我使用m

我试图在
URLClassLoader
中加载一个JAR文件。这个JAR文件存储在我的项目的资源中,当我使用maven运行我的项目时,它与以下代码配合良好:

new URLClassLoader(
    new URL[]{MyClass.class.getClassLoader().getResource("dependencies/dependency.jar")},
    ClassLoader.getSystemClassLoader().getParent()
);
但是,当我使用
mvn clean install
构建项目,然后尝试使用
java-JAR myapp.JAR
运行generate JAR时,似乎没有加载
依赖项.JAR
dependency.jar
文件正确地存储在项目jar中的
dependency/dependency.jar
下,但它不被读取

我假设它不能从JAR文件中加载,但它们是一种解决方法吗

我认为一个解决方案是使用
getResourceAsStream
,但我需要将此流转换为URL


如果可能的话,我想使用一种解决方案,它不需要创建一个临时文件来存储
dependency.jar

的内容。我相信您的问题是因为无法在zip中读取zip,因此,您应该将jar文件复制到一个临时文件中,并将该临时文件提供给
URLClassLoader
,如下所示:

// Get the URL of my jar file
URL url = MyClass.class.getResource("/dependencies/dependency.jar");
// Create my temporary file
Path path = Files.createTempFile("dependency", "jar");
// Delete the file on exit
path.toFile().deleteOnExit();
// Copy the content of my jar into the temporary file
try (InputStream is = url.openStream()) {
    Files.copy(is, path, StandardCopyOption.REPLACE_EXISTING);
}
// Create my CL with this new URL
URLClassLoader myCL = new URLClassLoader(
    new URL[]{path.toUri().toURL()}, ClassLoader.getSystemClassLoader().getParent()
);

dependency.jar是否位于jar文件中?如果是的,具体在哪里?是的,它在我的项目的资源中,所以在构建的JAR中它位于
dependency/dependency.JAR
中,你试过MyClass.class.getResource(“/dependency/dependency.JAR”)了吗?那么它甚至不适用于maven^^^是的,但适用于java-JAR myapp.JAR是的,恐怕这就是我必须要做的,谢谢我只是想知道是否有其他解决方案。我不确定是否需要StandardCopyOption.REPLACE_EXISTING,因为Files.createTempFile不应该创建两次相同的文件。如果不添加它,您会遇到问题吗?嗯,
文件。copy
尝试创建文件。文档中甚至写道:“默认情况下,如果目标文件已经存在或是符号链接,则复制失败。”