애플릿 클래스 로더는 애플릿의 항아리에서 클래스를 찾을 수 없습니다.

StackOverflow https://stackoverflow.com/questions/872905

  •  22-08-2019
  •  | 
  •  

문제

나는이 질문을하기 시작한 다음 제출하기 전에 답을 알아 냈습니다. 어쨌든 같은 문제를 겪는 다른 사람들이 내 실수로부터 배울 수 있도록 질문을 게시하기로 결정했습니다.


애플릿에 문제가 있습니다 (a Japplet 실제로) 애플릿과 동일한 항아리에 포함 된 다른 클래스를 인스턴스화 할 수 없습니다. Java 콘솔에서보고있는 예외는 다음과 같습니다.

Exception in thread "thread applet-com.company.program.cm.hmi.MediatorApplet-1" java.lang.NoClassDefFoundError: com/company/program/cm/cs/JDataStore
    at com.company.program.cm.hmi.MediatorApplet.getMediator(MediatorApplet.java:63)
    at com.company.program.cm.hmi.MediatorApplet.init(MediatorApplet.java:49)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.company.program.cm.cs.JDataStore
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    ... 4 more
Caused by: java.io.IOException: open HTTP connection failed:http://localhost:8080/TransportHMI/pages/com/company/program/cm/cs/JDataStore.class
    at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    ... 8 more

나는 그것을 알고있다 JDataStore 클래스는 항아리에 포함되어 있습니다. 사용하는 내용을 나열하는 경우 jar tvf CM_Library.jar 적절한 패키지 아래에 있다는 것을 알 수 있습니다. 그러나 위의 사슬 예외는 클래스 로더가 아카이브를 검색하지 않는다고 믿게합니다. JDataStore, 대신 웹 서버에서 jdatastore.class 파일을 찾고 있습니다. 왜 이런거야? 클래스 로더는 JAR에서 MediatorApplet 클래스를로드하는 것을 알고 있습니다. 왜 JDatastore에서도 확인하지 않습니까? 애플릿 태그에서 매개 변수를 올바르게 지정하지 않은 경우 여기에도 포함하겠습니다.

<applet id="mediator-applet"
        width="0"
        height="0"
        codebase="./"
        archive="CM_Library.jar"
        code="com.company.program.cm.hmi.MediatorApplet">
</applet>
도움이 되었습니까?

해결책

보고있는 것에서 답을 찾았습니다 제안 a 관련 질문. Eddie의 대답은 그 특정 문제를 해결하지 못했지만 저의 해결책을 제시했습니다.

내 질문에서 특히 분명하지 않은 것은 Jdatastore 클래스가 다른 항아리에 포함 된 다른 클래스에서 상속된다는 것입니다. 몇 달 만에 JDatastore의 구현 세부 사항을 다룰 필요가 없었기 때문에 부모 클래스 org.json.simple.jsonobject가 CM_Library.jar에 있지 않았지만 JSON_SIMPLE-1.0에 있었다는 것을 완전히 잊었습니다. .2.jar. 수정 사항은 상당히 간단합니다. 누락 된 항아리를 Codebase 디렉토리에 복사하고 누락 된 항아리를 Applet 태그의 쉼표로 구분 된 아카이브 목록에 추가하십시오. archive 기인하다:

<applet id="mediator-applet"
        width="0"
        height="0"
        codebase="./"
        archive="CM_Library.jar, json_simple-1.0.2.jar"
        code="com.company.program.cm.hmi.MediatorApplet">
</applet>

오류가 수정됩니다. 예외 메시지는 특히 도움이되지 않습니다. 실제 문제는 요청 된 클래스에 대한 슈퍼 클래스를로드 할 수 없다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top