2014-10-15 3 views
0

Я вызываю Java-апплет из Javascript. Код Java должен запускаться в привилегированном режиме (в конце концов он отобразит файл выбора, который будет отображать файлы с локального жесткого диска). Вызов Javascript возвращает java.lang.reflect.InvocationTargetException. Любые идеи о том, как я могу заставить этот код работать, или любые методы отладки, чтобы получить больше информации о том, почему он терпит неудачу, будут очень признательны.Запуск Priviliged Code в Java Applet

Вот класс Java. Я удалил весь ненужный код, чтобы попытаться выявить настоящую проблему.

// Java code 

public class OHLib extends Applet { 

    public String getFile() { 

     String result; 
     try { 
      // this code does NOT generate an exception 
      result = (String) AccessController.doPrivileged(new PrivilegedAction() { 
       public String run() { 
        // JFileChooser code will go here 
        return "xxx"; 
       } 
      }); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return result; 

    } 
} 

Я не получаю информацию об исключении из вышеуказанного блока try/catch.

Приведенный выше код вызывается JavaScript следующим образом:

// JavaScript code 

function BrowseForFile() { 

    var x; 
    try { 
     // this code generates InvocationTargetException 
     x = ohApplet.getFile(); 
    } catch (e) { 
     console.log(e); 
    } 

} 

Приведенный выше код, где я получаю InvocationTargetException.

Апплет развернут на моей веб-страницы следующим образом:

<script src="/plugins/deployJava.js"></script> 

<script> 
    var attributes = { 
     id:'ohApplet', 
     code:'OHLib', 
     codebase: 'java', 
     archive: 'OHLib.jar', 
     width:1, 
     height:1, 
    } ; 
    var parameters = { 
     jnlp_href: 'OHLib.jnlp', 
     classloader_cache: 'false', 
    } ; 
    deployJava.runApplet(attributes, parameters, '1.6'); 

Апплет в подписанном файле фляги, со следующими манифеста:

Application-Name: <appname> 
Permissions: all-permissions 
Codebase: <domain>.dev <domain>.com 
Caller-Allowable-Codebase: <domain>.dev <domain>.com 
Application-Library-Allowable-Codebase: <domain>.dev <domain>.com 

Файл JNLP выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<jnlp spec="1.0+" codebase="" href=""> 

    <information> 
     <title>...</title> 
     <vendor>...</vendor> 
    </information> 

    <security> 
     <all-permissions /> 
    </security> 

    <resources> 
     <j2se version="1.8+" href="http://java.sun.com/products/autodl/j2se" /> 
     <jar href="OHLib.jar" main="true" /> 
    </resources> 

    <applet-desc 
     main-class="OHLib" 
     name="OHLib" 
     width="1" 
     height="1"> 
    </applet-desc> 
</jnlp>   

Любые идеи о том, как я могу заставить этот код работать, или любые методы отладки, чтобы получить больше информации Было бы очень благодарно за то, почему он терпит неудачу.

ответ

0

Проблема заключалась в том, что я не включал анонимный внутренний класс (OHLib $ 1.class) в файл jar. Моя оригинальная jar команда выглядела следующим образом:

jar cfmv OHLib.jar "../../jar_manifest.txt" OHLib.class 

Изменение его ниже фиксированной задачи:

jar cfmv OHLib.jar "../../jar_manifest.txt" OHLib.class OHLib$1.class 

Кредиты перейти к this page для решения.