gpt4 book ai didi

java - 找不到功能 'default' 的元工厂;这通常意味着 axiom-impl.jar 不在类路径中

转载 作者:行者123 更新时间:2023-11-30 07:52:58 26 4
gpt4 key购买 nike

来自下面链接中的答案Link

我发现可以通过将其添加到classpath中来解决。但我正在使用自定义类加载器来加载 jar axiom-impl-1.2.14。有什么办法可以实现这一点吗?

axiom jar 正在使用 ClassLoader。枚举 getResources(String name) 在 jar 内部加载该 xml。在我们的例子中,XML 文件位于 jar 文件中。所以我正在寻找可以获取 XML 文件 URL 的解决方案。

源代码:

公共(public)类ExternalClassLoader扩展了ClassLoader {

private String jarFile = "";
private Hashtable<String, Class> classes = new Hashtable<String, Class>();

public ExternalClassLoader(String jarLocation) {
super(ExternalClassLoader.class.getClassLoader());
this.jarFile = jarLocation;
}

@Override
public Class loadClass(String className) throws ClassNotFoundException {
return findClass(className);
}

@Override
public Class findClass(String className) {

byte classByte[];
Class result = null;
System.out.println("CLASS : " + className);
result = (Class) classes.get(className);
if (result != null) {
return result;
}
try {
return findSystemClass(className);
} catch (Exception e) {
}
JarFile jar = null;
try {
jar = new JarFile(jarFile);
String classLocation = className.replace('.', '/');
JarEntry entry = jar.getJarEntry(classLocation + ".class");
InputStream is = jar.getInputStream(entry);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
int nextValue = is.read();

while (-1 != nextValue) {
byteStream.write(nextValue);
nextValue = is.read();
}

classByte = byteStream.toByteArray();
result = defineClass(className, classByte, 0, classByte.length, null);
classes.put(className, result);
return result;
} catch (Exception e) {
System.out.println("ERROR CLASS : " + className);
return null;
} finally {
try {
jar.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

@Override
public InputStream getResourceAsStream(String name) {
try {
System.out.println("RESOURCE : " + jarFile + "//" + name);
JarFile jar = new JarFile(jarFile);
JarEntry entry = jar.getJarEntry(name);
return jar.getInputStream(entry);
} catch (IOException e) {
System.out.println("ERROR RESOURCE : " + jarFile + "//" + name);
return null;
}
}

}

最佳答案

由于您没有指定详细信息,我假设与类加载器的类路径中的另一个版本的 axiom-impl 发生冲突,应用程序的其余部分已加载(否则您可以只使用一个或多个 URLClassLoader 实例或更改应用程序类加载器的类加载策略)。

我还假设(正如您在评论中提到的)axiom-apiaxiom-impl 均由同一个自定义类加载器加载,或者您认为将这两个 JAR 中的类合并到一个 JAR 中(在这种情况下,我假设您不在同一个 JAR 中包含 axiom-dom,因为这会导致其他问题)。

如果这些假设成立,那么您需要的是一个类加载器,它从一个或多个 JAR 文件加载类,并使用父级最后作为类加载策略。为了实现这一点,您不需要像您在发布的代码中尝试那样重新实现 JAR 加载逻辑。相反,您可以使用 URLClassLoader,但您需要扩展它以将其类加载策略从默认的父级加载更改为父级加载最后。 Apache Axiom 本身的源代码中实际上有一个这样的示例:

http://svn.apache.org/repos/asf/webservices/axiom/tags/1.2.15/axiom-api/src/test/java/org/apache/axiom/util/stax/dialect/ParentLastURLClassLoader.java

您可能可以按原样使用该代码,尽管您可能希望删除 javax.* 上的包过滤器,因为在您的情况下这不是必需的。

关于java - 找不到功能 'default' 的元工厂;这通常意味着 axiom-impl.jar 不在类路径中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com