簡體   English   中英

NoClassDefFoundError:javax / ws / rs / WebApplicationException

[英]NoClassDefFoundError: javax/ws/rs/WebApplicationException

我有以下使用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的實現嗎?

那就是我所希望的。

Java加載類時,它會通過類文件進行工作,並確保可以加載所有必需的類型,然后再視為該類被加載。

在這種情況下,您的PackageProcessor需要WebApplicationException因為在catch子句中已提及。 Java嘗試加載整個PackageProcessor ,但由於在類路徑上未找到WebApplicationException而失敗。

您的類PackageProcessor使用WebApplicationException類,因此在創建類的實例時必須初始化該類。

同樣在更多細節上:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1 :您的類在創建實例后會初始化。

T是一個類,並且創建了T的一個實例

初始化后,它將嘗試加載其引用的所有類,包括WebApplicationException (由您的代碼引用)。 由於找不到此類,因此發生錯誤。

在您的異常類中包裝WebApplicationException實例是不夠的,因為首先您必須捕獲WebApplicationException ,然后,您需要擁有該類(即之前加載它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM