使用编译器API编译Java代码时出现问题

3
我正在构建一个Swing应用程序,将使用Java WebStart进行分发。这是一种Java编辑器,我的应用程序用户将能够编译Java源代码。
问题是 -
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

它在开发环境中运行良好。但是当我使用Webstart部署我的应用程序时,在客户端上它返回null值。这是因为我的应用程序正在JRE而不是JDK上运行 [System.getProperty("java.home")指向JRE]。
为了解决这个问题,我遵循了以下SO线程中提到的建议。
链接:Null Pointer Exception while using Java Compiler API 我将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();
}

异常 -

enter image description here

请帮我解决这个问题。 ADD 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>

谢谢


你是否已经正确地为你的小程序签名了?否则它在客户端机器上只会有非常有限的权限! - Gyro Gearless
是的,我做到了。Swing应用程序正常工作。在JNLP文件中,我已经将所有权限设置为'all-permissions'。编译过程在我的开发环境(使用eclipse)中运行良好。谢谢。 - Manas Mukherjee
  1. 请务必使用 JaNeLA 检查 JNLP 文件。
  2. “我正在将 java.home 属性指向 JDK 的安装目录。” 这对于您的用户来说应该如何工作? 您是否希望他们自己更改属性?
  3. 请不要发布文本信息的截图。请复制/粘贴 文本。这不仅可以减少其他人下载/查看的字节数,而且可以进行搜索。
- Andrew Thompson
  1. 我使用Janela验证了JNLP。我没有发现任何问题。我将在帖子中添加JNLP。
  2. 在客户端,我执行System.getenv()来获取JAVA_HOME并将其设置为java.home属性[System.setProperty("java.home",USERS_JAVA_HOME);]。
  3. 我无法从Webstart的日志窗口复制异常跟踪。这就是为什么我将其粘贴为图像的原因。我明白这不好。感谢您的建议。
- Manas Mukherjee
1个回答

0

错误应该帮助描述出错的具体原因。

"AccessControlContext.checkPermission" 失败并显示 "AccessControlException: access denied"。

检查在该程序启动 JVM 时正在运行进程的用户。确保启动 JVM 的用户是超级用户管理员,具有完整目录树等的所有权限,看看是否解决了问题。然后缩减访问权限,直到再次出现错误,这将是正确的权限级别。


我在系统中拥有完整的管理员权限。它可以从Eclipse工作。但是当我使用Java Web Start进行部署并通过浏览器访问时,我才会遇到这个问题。 您是否建议我使用自定义策略(-Djava.security.policy)来获得所有权限?我不知道如何在jnlp文件中提及它。从我的应用程序中,我正在更改java.home属性以指向JDK。这会导致任何问题吗?谢谢。 - Manas Mukherjee
当通过Java Web Start运行时,它将作为该进程的不同用户(系统用户)运行,这可能没有足够的权限来访问资源。尝试以系统管理员身份从控制台运行(而非Web Start),看看是否解决了问题。 - Darrell Teague

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接