NoClassDefFoundError:javax/ws/rs/WebApplicationException
我有一个使用JAX-RS使用api的类:NoClassDefFoundError:javax/ws/rs/WebApplicationException,java,exception,jax-rs,noclassdeffounderror,netbeans-8,Java,Exception,Jax Rs,Noclassdeffounderror,Netbeans 8,我有一个使用JAX-RS使用api的类: public class PackageProcessor implements IPackageProcessor { public PackageProcessor() { } @Override public PackageDimensions getPackageDimensions(byte[] image) throws PackageProcessorException { Imag
public class PackageProcessor implements IPackageProcessor {
public PackageProcessor() {
}
@Override
public PackageDimensions getPackageDimensions(byte[] image) throws PackageProcessorException {
Image imageBase64 = toBase64(image);
PackageDimensions dimensions = null;
try {
Client client = ClientBuilder.newClient();
dimensions = client.target(BASE_URI)
.path(DIMENSIONS_PATH)
.request(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.post(Entity.json(imageBase64))
.readEntity(PackageDimensions.class);
} catch (WebApplicationException ex) {
throw new PackageProcessorException("Error al procesar la imagen", ex);
}
return dimensions;
}
}
我尝试在Java应用程序中使用它,只是为了测试它是否有效:
public static void main(String[] args) {
try {
IPackageProcessor p = new PackageProcessor();
Path path = Paths.get("path");
byte[] data = Files.readAllBytes(path);
PackageDimensions d = p.getPackageDimensions(data);
} catch (IOException ex) {
Logger.getLogger(Prueba.class.getName()).log(Level.SEVERE, null, ex);
} catch (PackageProcessorException ex) {
Logger.getLogger(Prueba.class.getName()).log(Level.SEVERE, null, ex);
}
}
但是,当我尝试运行此应用程序时,在执行新PackageProcessor()
的行中出现以下错误:
我明白它的意思,但我不会调用任何将其抛出构造函数的东西,是吗
我不想在java应用程序中向JAX-RS添加依赖项,这就是我在自己的异常类PackageProcessorException
中封装一个可能的WebApplicationException
。我想那就足够了
我做错了什么
我正在使用Netbeans,如果这能改变什么的话
更新
感谢您的解释,这些解释似乎是正确的,但如果是这样的话,我的java应用程序就无法忽略PackageProcessor
的实现
这正是我所希望的。当Java加载类时,它通过类文件工作,并确保在类被视为加载之前可以加载所有必需的类型
在这种情况下,您的
PackageProcessor
需要WebApplicationException
,因为它在catch
子句中提到。Java试图加载整个PackageProcessor
,但失败了,因为在类路径上找不到WebApplicationException
。您的类PackageProcessor
使用WebApplicationException
类,因此在创建类实例时必须初始化该类
更详细的内容也一样:
:您的类在创建其实例时初始化
T是一个类,并且创建了T的一个实例
初始化时,它会尝试加载它引用的所有类,包括WebApplicationException
(由代码引用)。由于找不到此类,因此发生错误
在异常类中包装
WebApplicationException
实例是不够的,因为首先必须捕获WebApplicationException
,要做到这一点,您需要让类(即之前加载它)。在编译时,您的程序可能会忽略PackageProcessor
的实现,但是在运行时,您必须在类路径中具有某些类(实现依赖项,如WebApplicationException
),因此答案是“是”和“否”。
Exception in thread "main" java.lang.NoClassDefFoundError: javax/ws/rs/WebApplicationException
at prueba.Prueba.main(Prueba.java:25)
Caused by: java.lang.ClassNotFoundException: javax.ws.rs.WebApplicationException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more