NoClassDefFoundError:javax / ws / rs / WebApplicationException

时间:2017-06-14 18:54:35

标签: 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 {
        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添加依赖性,这就是我在我自己的异常类WebApplicationException中封装可能的PackageProcessorException的方式。我认为这就足够了。

我做错了什么?

我正在使用Netbeans,如果这改变了什么

更新

感谢您的解释看似正确,但如果是这样的话,我的java应用程序无法忽略PackageProcessor的实现?

这就是我所希望的。

2 个答案:

答案 0 :(得分:0)

当Java加载类时,它会在类文件中运行,并确保它可以在该类被认为加载之前加载所有必需的类型。

在这种情况下,您的PackageProcessor需要WebApplicationException,因为它在catch子句中有提及。 Java尝试加载整个PackageProcessor并失败,因为在类路径中找不到WebApplicationException

答案 1 :(得分:0)

您的班级PackageProcessor使用WebApplicationException班级,因此在创建班级实例时必须初始化此班级。

更详细的相同内容:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1:在创建实例时初始化您的类。

  

T是一个类,并且创建了T的实例

初始化时,它会尝试加载它引用的所有类,包括WebApplicationException(由代码引用)。由于找不到此类,因此会发生错误。

在您的异常类中包装WebApplicationException实例是不够的,因为首先必须捕获WebApplicationException,为此,您需要拥有该类(即之前加载它)。