2013-06-21 10 views
13

Od aktualizacji java 7 25 uruchomionej przez Oracle nasza aplikacja przestała działać.Aktualizacja Java 7 powoduje, że nasza aplikacja startowa java nie działa bez logowania

Początkowo otrzymaliśmy ostrzeżenie o kodbase & brakujących tagów sercowych w pliku Manifest, który naprawiliśmy.

Problem teraz skończy się to, że w konsoli tylko otrzymamy następujące wiersze:

#### Java Web Start Error: 
#### null 

również uzyskać błąd aplikacji okno z komunikatem: Nie można uruchomić aplikację.

przycisk Szczegóły daje następujące szczegóły w Wyjątek:

java.lang.NullPointerException 
    at com.sun.jnlp.JNLPClassLoader.getPermissions(Unknown Source) 
    at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at desktop.DesktopProxySelector.<init>(DesktopProxySelector.java:24)  <- code smippet below 
    at desktop.Main.main(Main.java:139)          <- code smippet below 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.javaws.Launcher.executeApplication(Unknown Source) 
    at com.sun.javaws.Launcher.executeMainClass(Unknown Source) 
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source) 
    at com.sun.javaws.Launcher.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:724) 

Odpowiednie fragmenty kodu są:

Desktop.Main.main 

/** 
* Main method, starts the application 
*/ 
public static void main(String[] args) { 
    System.setProperty("java.net.useSystemProxies", "true"); 

    //Logger.getLogger("httpclient.wire.header.level").setLevel(Level.FINEST); 
    //Logger.getLogger("org.apache.commons.httpclient.level").setLevel(Level.FINEST); 
    java.net.ProxySelector.setDefault(new DesktopProxySelector(java.net.ProxySelector.getDefault())); 

(Ostatnia linia jest numer linii 139)

desktop.DesktopProxySelector: 

public class DesktopProxySelector extends ProxySelector { 

    public DesktopProxySelector(ProxySelector defaultSelector) { 
    URI httpsUri = new CentralConfigurationService().getCentralLocation(); 

(Ostatnia linia to linia numer 24, w której wystąpi wyjątek)

Czy ktoś może podać nam wskazówki (lub lepsze rozwiązanie) dla tego nowego zachowania java spowodowane przez tę "drobną" aktualizację.

Gdy uruchomimy aplikację bezpośrednio z cli przy użyciu java -jar Desktop.jar aplikacja uruchom plik, więc problem ma wyraźnie coś ze zmianami w java web start.

@trashgod: błąd wyraźnie ma coś wspólnego ze zmianą uprawnień w 7u25, ponieważ wyjątek NullPointerException występuje w com.sun.jnlp.JNLPClassLoader.getPermissions.

Wystarczy, aby wyjaśnić, co się dzieje, myślę (jestem kolega Wouter): desktop.Main instancję desktop.DesktopProxySelector (nasza klasa), desktop.DesktopProxySelector instancję desktop.configuration.CentralConfigurationService desktop.configuration.CentralConfigurationService tworzy instancję java.net.URI.

W pierwszym wierszu init programu DesktopProxySelector, w którym tworzona jest usługa CentralConfigurationService, metoda getPermissions wywoływana przez JNLPClassLoader generuje wyjątek NullPointerException. Coś dzieje się nie tak podczas ładowania klasy CentralConfigurationService przez webhosta java z uzyskiwaniem uprawnień dla klasy. Czy to może mieć coś wspólnego z faktem, że klasa URI jest instancjonowana, co wymaga dodatkowych uprawnień (połączenie z zdalnym URI jest konfiguracją)?

+0

Uhm dobrze, JavaFX jest teraz dołączony do u25 z tego, co przeczytałem, ale nie wiem, czy to mogłoby wywołać _atak_ – fge

+0

Do tej pory widzę tylko aktualizację, która ujawnia moje własne błędy. Zobacz także te powiązane [Q & A] (http://stackoverflow.com/q/17210607/230513), [Q & A] (http://stackoverflow.com/q/17204465/230513). – trashgod

+0

Problem wydaje się być związany z połączeniami sieciowymi w java webstart ze zmianami w systemie uprawnień w java 7u25. Jak tylko skomentujemy wiersz 139 w głównym, dokładnie ten sam wyjątek pojawia się na pulpicie. Głównie $ 2.run (Main.java:148), który czyta HttpClientFactory.initialize() ;. Tak naprawdę wygląda na to, że jest błąd w nowym systemie uprawnień w java 7u25, gdzie połączenia sieciowe dotyczą witryny internetowej Java. –

Odpowiedz

6

Ostatecznie problem został rozwiązany. Problem został spowodowany między niezgodnością w dołączonych plikach jar w głównym pliku MANIFEST.MF a plikami jar wymienionymi w pliku launch.jnlp.

Wymagane jest teraz, aby wszystkie pliki jar, które będą używane, były również obecne w pliku launch.jnlp.

(W przeszłości zdecydowano o ręcznym przechowywaniu tego pliku w zlewie, który oczywiście nie zawsze był przechowywany w sposób automatyczny, teraz proces ten jest zautomatyzowany, więc problem nie powinien już nam się zdarzyć.)

+1

wydaje się to złym pomysłem - wymagającym duplikowania informacji w pliku .jar, a plik jnlp stwarza możliwość wystąpienia błędów bez dodawania jakichkolwiek zabezpieczeń (ponieważ kontrolujesz zawartość obu) – ddyer

+0

To jest coś, co dla mnie dzieje się automagicznie przez netbeans . Może być związane ze sposobem, w jaki projekt został skonfigurowany w przeszłości. – Wouter

+0

@Wouter, używam Netbeans do kompilowania mojej aplikacji .jnlp. Dostaję również ten błąd. Jak dodać pliki jar do pliku MANIFEST.MF? – ryvantage