【问题标题】:Issue while compiling java code using compiler API使用编译器 API 编译 java 代码时出现问题
【发布时间】:2013-09-22 10:59:02
【问题描述】:

我正在构建一个将使用 java webstart 分发的 swing 应用程序。 它是一种 java 编辑器,我的应用程序的用户可以在其中编译 java 源代码。

问题是——

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

它在开发环境中运行良好。但是当我使用 webstart 部署我的应用程序时,然后在客户端,它返回 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>

谢谢

【问题讨论】:

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

标签: java swing security java-web-start accesscontrolexception


【解决方案1】:

错误应该有助于准确描述问题所在。

“AccessControlContext.checkPermission”失败并出现“AccessControlException: access denied”。

当此应用程序的 JVM 启动时,检查该进程与哪个用户一起运行。确保启动 JVM 的用户是超级用户管理员,对完整目录树等具有所有权限,并查看是否可以修复它。然后缩小访问权限,直到它再次中断,您将拥有正确的权限级别。

【讨论】:

  • 我在我的系统中拥有完全的管理员权限。它正在日食中工作。但是,当我使用 java web-start 进行部署并使用浏览器访问相同的内容时,只有我遇到了这个问题。您是否建议我使用具有所有权限的自定义策略(-Djava.security.policy)?我不知道如何在 jnlp 文件中提及这一点。在我的应用程序中,我将 java.home 属性更改为指向 JDK。这会引起任何问题吗?感谢您的建议。
  • 当通过 Java web-start 运行时,它将作为该进程的不同用户(系统用户)运行,这可能没有足够的权限来访问资源。以系统管理员身份从控制台运行(不是网络启动),看看是否可以解决。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多