Проблема при компиляции кода Java с использованием API компилятора

Я создаю приложение Swing, которое будет распространяться с использованием java webstart. Это своего рода редактор Java, в котором пользователи моего приложения смогут компилировать исходный код Java.

Проблема в том -

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

Он отлично работает в среде разработки. Но когда я развертываю свое приложение с помощью веб-старта, то на стороне клиента оно возвращает значение null. Это связано с тем, что мое приложение работает на JRE вместо JDK. [System.getProperty ("java.home") указывает на JRE]

Чтобы решить эту проблему, я последовал предложению, упомянутому в следующей ветке SO.

Я указываю свойство java.home на каталог установки JDK.

System.setProperty("java.home","C:\\DevEnv\\java");

Теперь ToolProvider.getSystemJavaCompiler(); возвращает допустимый объект компилятора, но я получаю следующее исключение при компиляции с ним кода Java. Фактически это происходит при вызове метода getStandardFileManager объекта компилятора.

Код

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    System.out.println("Compiler - " + compiler);

    if(compiler!=null){
        MyDiagnosticListener c = new MyDiagnosticListener(logWindow);
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(c, Locale.ENGLISH, null);

        Iterable<String> options = Arrays.asList("-d", CLASS_OUTPUT_DIR);
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
                            c, options, null, files);
        Boolean result = task.call();
}

Исключение -

введите описание изображения здесь

Пожалуйста, помогите мне решить эту проблему.

ДОБАВИТЬ JNLP

<?xml version="1.0" encoding="utf-8"?> 
<jnlp spec="1.0+" codebase="http://<dynamic-ip>:8080/" href="ProjT.jnlp">
    <information>
        <title>Tectra</title>
        <vendor>Manas Kumar Mukherjee</vendor>
        <homepage href="http://<dynamic-ip>:8080/" />
        <description>Testing Testing</description>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6+" />
        <jar href="Tools.jar" />
...
        <jar href="log4j-1.2.16.jar" />
    </resources>
    <application-desc main-class="com.ui.DevMain" />
</jnlp>

Спасибо


person Manas Mukherjee    schedule 17.09.2013    source источник
comment
Вы правильно подписали свой апплет? В противном случае у него будут только очень ограниченные разрешения на клиентской машине!   -  person Gyro Gearless    schedule 18.09.2013
comment
да. Приложение Swing работает правильно. В файле JNLP я установил все "все разрешения" в атрибуте безопасности. Процесс компиляции отлично работает в моем dev env (с использованием eclipse). Спасибо   -  person Manas Mukherjee    schedule 18.09.2013
comment
1) Обязательно проверьте JNLP с помощью JaNeLA. 2) Я указываю свойство java.home на каталог установки JDK. Как это должно работать для ваших пользователей? Вы ожидаете, что они сами изменят свойства? 3) Просьба не размещать скриншоты с текстовой информацией. Скопируйте / вставьте текст. Это не только меньше байтов для загрузки / просмотра другими пользователями, но и возможность поиска.   -  person Andrew Thompson    schedule 18.09.2013
comment
1) Я проверил JNLP с помощью Janela. Я не нашел никаких проблем. Я добавляю JNLP в пост. 2) На стороне клиента я выполняю System.getenv () для получения JAVA_HOME и устанавливаю его в свойстве java.home [System.setProperty (java.home, USERS_JAVA_HOME);]. 3) Мне не удалось скопировать трассировку исключения из окна журнала веб-старта. Я вставил это как изображение. Я понимаю, это нехорошо. Спасибо за ваше предложение.   -  person Manas Mukherjee    schedule 19.09.2013


Ответы (1)


Ошибка должна помочь описать, что именно не так.

«AccessControlContext.checkPermission» не выполняется с «AccessControlException: доступ запрещен».

Проверьте, с каким пользователем выполняется процесс при запуске JVM для этого приложения. Убедитесь, что пользователь, запускающий JVM, является администратором суперпользователя со всеми правами на полное дерево каталогов и т. Д., И посмотрите, исправит ли это это. Затем уменьшите права доступа, пока они снова не сломаются, и у вас будет правильный уровень разрешений.

person Darrell Teague    schedule 18.09.2013
comment
У меня есть полные права администратора в моей системе. Работает от затмения. Но когда я развертываю с помощью java web-start и получаю доступ к нему с помощью браузера, то только у меня возникает эта проблема. Вы предлагаете мне использовать настраиваемую политику (-Djava.security.policy) со всеми разрешениями? Не знаю, как об этом упомянуть в файле jnlp. В своем приложении я меняю свойство java.home на JDK. это вызывает какие-то проблемы? Спасибо в нареч. - person Manas Mukherjee; 18.09.2013
comment
При запуске через веб-запуск Java он будет работать как другой пользователь для этого процесса (системный пользователь), который, вероятно, не имеет достаточных разрешений для доступа к ресурсу. Запустите с консоли от имени системного администратора (не веб-запуск), чтобы увидеть, решит ли это. - person Darrell Teague; 03.10.2013