2013-04-18 39 views
13

Java applet của tôi ngừng hoạt động khi JRE đã được cập nhật lên 7u21.Java applet ngừng hoạt động sau khi cập nhật lên JRE 7u21

tóm tắt ngắn:

  • Các Exceptions tôi nhận được là: netscape.javascript.JSException và
    java.lang.NoClassDefFoundError. các applet làm việc tốt cho đến khi JRE 7u21.

  • Ứng dụng này được nhúng vào một trang web bằng cách sử dụng DeployJava.js của Oracle.

  • Applet được ký, nó sử dụng LiveConnect để kích hoạt sự kiện, nó truy cập USB và cổng nối tiếp thông qua JNI, nó sử dụng mã từ nhiều tệp JAR.

  • Lỗi xảy ra trên tất cả các trình duyệt trên máy tính để bàn được thử nghiệm (Firefox, chrome, IE8/9 và Safari trên Mac).

chi tiết:

  • Tôi có một applet java cho phép trang web của tôi để giao tiếp với một thiết bị USB.

  • Ứng dụng này đã hoạt động tốt trong năm qua.

  • Sau khi bản cập nhật JRE7 21 được phát hành - applet ngừng hoạt động.

  • Ứng dụng này được lưu trữ trong một trang web (ASP.NET) bằng thư viện DeployJava.js của Oracle.

  • Nó sử dụng LiveConnect để tăng sự kiện trở lại mã javascript của tôi.

Vấn đề đầu tiên tôi đã có trên JRE 7u21 là một ngoại lệ trên nỗ lực đầu tiên để nâng cao một sự kiện thông qua LiveConnect:

netscape.javascript.JSException: JavaScript error while calling "_notify" 
at sun.plugin2.main.client.MessagePassingJSObject.newJSException(Unknown Source) 
at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source) 
at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source) 
at <myapplet>.fireJavascriptEvent(Unknown Source) 
at <myapplet>$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.asec.easypark.applets.HomeloadingApplet.start(Unknown Source) 
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

để giảm thiểu vấn đề này tôi đã thêm dòng sau vào 'manifest 'phần trong kịch bản kiến ​​cho applet:

attribute name="Trusted-Library" value="true" 

tôi đã xây dựng applet sử dụng JDK 7u21 và nó dường như giúp:

sau đó tôi bắt đầu nhận được một lỗi khác - vì vậy tôi tin rằng điều này đã được giải quyết, nhưng nó có thể đã gây ra vấn đề tiếp theo.

vấn đề thứ hai là: applet đang gọi mã từ một số tệp JAR. trên cuộc gọi đầu tiên để mã trong một tập tin JAR (không phải là các applet) không thành công với những ngoại lệ sau đây:

**java.lang.NoClassDefFoundError**: com/codeminders/hidapi/HIDManager 
    at <PackageInSecondJar>.communication.HIDTransmitter.open(Unknown Source) 
    at <PackageInSecondJar>.communication.HIDTransmitterSearcher.find(Unknown Source) 
    at <PackageInSecondJar>.communication.CompositeTransmitterSearcher.find(Unknown Source) 
    at <PackageInAppletJar>.communication.AppletCommunicationBroker.setupDeviceProxy(Unknown Source) 
    at <PackageInAppletJar>.communication.AppletCommunicationBroker.setup(Unknown Source) 
    at <PackageInAppletJar>.<TheApplet>$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at <PackageInAppletJar>.<TheApplet>.start(Unknown Source) 
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Tôi đã thử các biện pháp sau đây - nhưng không thành công:

  • thêm HTTP tiêu đề 'Cache-Control' = 'no-cache'

  • add HTTP tiêu đề 'Cache-Control' = 'no-cache, không có cửa hàng,-phải xác nhận lại'

  • sử dụng DeployJava.js mới nhất từ ​​http://java.com/js/deployJava.txt (sau khi đổi tên để .js)

Các applet đã có các tính năng:

  • dấu an ninh 'tất cả-quyền' trong jnlp

  • JAR chính được ký với chứng chỉ từ một CA bên ngoài

  • mã applet đang chạy bên trong một AccessController.doPrivileged khối.

Tôi là một newbie java vì vậy xin đừng bỏ qua các giải pháp rõ ràng ...

Cảm ơn trước sự giúp đỡ của bạn,

Guy.

+1

bản sao có thể có của [Không thể khởi chạy ứng dụng bằng Java 7u21] (http://stackoverflow.com/questions/16083405/cannot-launch-applet-using-java-7u21) –

+0

Tôi đã tìm thấy [điều này thảo luận] (https://forums.oracle.com/forums/thread.jspa?threadID=2525898&tstart=0), cũng nhìn thấy một liên kết từ đó, trong đó có một giải pháp có thể, và xem nếu điều đó áp dụng cho bạn và giúp đỡ? – jkovacs

+0

Thx. Tôi đã nhìn thấy nó và nó thực sự là nguồn gốc của những sửa chữa đầu tiên tôi đã làm. nhưng bây giờ tôi có vấn đề thứ hai được mô tả ở trên (ngoại lệ java.lang.NoClassDefFoundError) hoặc là không liên quan hoặc gây ra bởi sửa chữa đó. – user1127788

Trả lời

1

Lỗi rất có thể do tệp Jar bị thiếu hoặc không thể truy cập được bằng applet. Điều này có thể là do:

  1. JAR nằm trên đường dẫn lớp của JVM cũ, nhưng không nằm trên đường dẫn mới của JVM cũ.
  2. Vì lý do nào đó, bạn đang phân phối applet mà không có JAR vô ý, và vấn đề không liên quan đến nâng cấp lên 7u2.
  3. Quy tắc cho các applet truy cập các tệp JAR bên ngoài đã thay đổi bằng cách nào đó, có thể liên quan đến bảo mật và bạn cần thực hiện một số thứ khác để bao gồm chúng.

Tệp JAR bạn đang thiếu là javahidapi, có thể tìm thấy tại đây: https://code.google.com/p/javahidapi/. Nếu bạn chắc chắn rằng nó tìm đường đến classpath, applet của bạn sẽ hoạt động.

0

Tôi không biết DeploJava.js bu vấn đề gì rõ ràng là một vấn đề về classpath.

Là một phương pháp, chúng tôi xác định tất cả thư viện của bên thứ ba trong thẻ lưu trữ. DeploJava.js có thể có các thuộc tính tương tự.

<APPLET codebase="./" code="AppletMainClass" archive="printer_applet.jar, pdf-renderer.jar, library3.jar"> 
1

Bailey S chắc chắn right.Make mà java có thể thấy rằng jar file.If bạn đang sử dụng Linux, thiết lập các đường dẫn trong/etc/biến con đường môi trường hoặc trong các cửa sổ, chỉ cần nhấp chuột phải vào máy tính của tôi, chuyển đến các thuộc tính, biến môi trường và đặt đường dẫn tại đó

1

Triển khai các ứng dụng đang khó khăn hơn khi Oracle sửa các lỗ hổng bảo mật.

Bạn đã đề cập đến applet của mình đã được ký - là tất cả của các JAR đã được ký chưa? Có một số thuộc tính mới bạn sẽ cần trong tệp kê khai của mình để có được tính năng này hoạt động.

ngắn tại đây: http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html

và bạn sẽ cần một này nói riêng để có được những biểu hiện được sắp xếp ra: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html

Nếu bạn sử dụng một số lọ không được ký kết, hoặc là Aren' t tất cả chữ ký của bạn, bạn cũng sẽ cần các chi tiết tại đây: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html

1

Không thể đặt thuộc tính của một applet hoạt động cả trên các phiên bản sau 7.0.21 trở xuống.

Trusted-Library: true 

thuộc tính hoạt động cho những người dưới 7.0.21 gây ra hộp thoại bảo mật được hiển thị (và hầu hết mã của bạn bị chặn) sau 7.0.21. Nếu bạn chỉ đặt

Caller-Allowable-Codebase: *.yourdomain.com 

đến file manifest của bạn, nó bắt đầu hoạt động tốt với các phiên bản sau 7.0.21 nhưng lần này nó dừng lại với các phiên bản dưới đây 7.0.21. Đây là một mớ hỗn độn lớn.

Tuy nhiên, họ đã khắc phục hành vi xấu này với phiên bản mới nhất (7.0.51). Vì vậy, tôi đề nghị sử dụng cả hai thuộc tính (Trusted-LibraryCaller-Allowable-Codebase) sẽ hoạt động cho Java 6 và 7.0.51. Tôi không nghĩ rằng có một giải pháp cho những người từ 7,0,21 đến 7,0,45. (Tôi không hỗ trợ chúng, chúng tôi yêu cầu khách hàng nâng cấp lên 7.0.51).

https://blogs.oracle.com/java-platform-group/entry/7u45_caller_allowable_codebase_and

0

Cùng xảy ra với tôi (trong môi trường java) mà hủy hoại cả ngày của tôi, netscape của JSObject hiện diện trong plugin.jar và jfxrt.jar cả của jre, bạn cần phải loại trừ một. nếu bạn cần cuộc gọi js, tôi nghĩ bạn cần plugin.jar jre 6 không chứa jfxrt.jar mới nhất (giải pháp liên quan đến JavaFX cho các applet trong web) để nó hoạt động trong jre6

cũng vậy không sử dụng thư viện đáng tin cậy trừ khi bạn muốn đăng ký riêng từng lọ. Hy vọng điều này sẽ giúp - Chaithanya

Các vấn đề liên quan