NoClassDefFoundError: javax/ws/rs/WebApplicationException
NoClassDefFoundError: javax/ws/rs/WebApplicationException
我有以下 class 使用 JAX-RS 消费 api:
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);
}
}
但是当我尝试 运行 这个应用程序时,我在执行 new PackageProcessor()
:
的行中收到以下错误
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
我明白这意味着什么,但我不会在构造函数中调用任何抛出它的东西,对吗?
我不想在我的 java 应用程序中添加对 JAX-RS 的依赖,这就是我在自己的异常 [=43] 中封装可能的 WebApplicationException
的方式=] PackageProcessorException
。我以为这样就够了。
我做错了什么?
我正在使用 Netbeans,如果这有任何改变的话
更新
感谢您的解释似乎是正确的,但如果是这样的话,我的 java 应用程序就无法忽略 PackageProcessor
的实现吗?
这正是我所希望的。
当 Java 加载 classes 时,它通过 class 文件工作并确保它可以在 class 被认为是之前加载所有必需的类型已加载。
在这种情况下,您的 PackageProcessor
需要 WebApplicationException
,因为 catch
子句中提到了它。 Java 尝试加载整个 PackageProcessor
但失败,因为在 class 路径上找不到 WebApplicationException
。
您的 class PackageProcessor
使用 WebApplicationException
class,因此当您创建 [=27= 的实例时必须初始化此 class ].
更多细节相同:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1 :您的 class 在其实例创建时被初始化。
T is a class and an instance of T is created
初始化后,它会尝试加载它引用的所有 classes,包括 WebApplicationException
(由您的代码引用)。由于找不到这个class,所以出现错误。
在您的异常 class 中包装 WebApplicationException
实例是不够的,因为首先您必须捕获 WebApplicationException
,为此,您需要 class(即之前加载它)。
我有以下 class 使用 JAX-RS 消费 api:
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);
}
}
但是当我尝试 运行 这个应用程序时,我在执行 new PackageProcessor()
:
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
我明白这意味着什么,但我不会在构造函数中调用任何抛出它的东西,对吗?
我不想在我的 java 应用程序中添加对 JAX-RS 的依赖,这就是我在自己的异常 [=43] 中封装可能的 WebApplicationException
的方式=] PackageProcessorException
。我以为这样就够了。
我做错了什么?
我正在使用 Netbeans,如果这有任何改变的话
更新
感谢您的解释似乎是正确的,但如果是这样的话,我的 java 应用程序就无法忽略 PackageProcessor
的实现吗?
这正是我所希望的。
当 Java 加载 classes 时,它通过 class 文件工作并确保它可以在 class 被认为是之前加载所有必需的类型已加载。
在这种情况下,您的 PackageProcessor
需要 WebApplicationException
,因为 catch
子句中提到了它。 Java 尝试加载整个 PackageProcessor
但失败,因为在 class 路径上找不到 WebApplicationException
。
您的 class PackageProcessor
使用 WebApplicationException
class,因此当您创建 [=27= 的实例时必须初始化此 class ].
更多细节相同:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1 :您的 class 在其实例创建时被初始化。
T is a class and an instance of T is created
初始化后,它会尝试加载它引用的所有 classes,包括 WebApplicationException
(由您的代码引用)。由于找不到这个class,所以出现错误。
在您的异常 class 中包装 WebApplicationException
实例是不够的,因为首先您必须捕获 WebApplicationException
,为此,您需要 class(即之前加载它)。