【问题标题】:accessing VM arguments during compile time在编译期间访问 VM 参数
【发布时间】:2014-08-26 23:11:32
【问题描述】:

我在访问我的程序中的 VM 参数时遇到问题。我正在编写一个注释处理器,我想在其中访问一些 VM 参数。我正在使用 NETBeans IDE。我创建注释处理器的 jar 文件,然后在另一个项目中使用它,该项目具有带有注释的 java 文件。

现在在我的注释处理器项目中,在 IDE 中我将 VM 参数设置如下

-Dname="hello from VM"

当我尝试访问注解处理器的 process() 函数时

String property = System.getProperty("name");

System.out.println(property);

它打印空。 我们可以在编译期间访问这些 VM 参数吗?因为注释处理器和带注释的类都在同一个 VM 中运行? 谢谢

【问题讨论】:

  • 您的问题与注释有何关系?
  • @Thirler - 我已经看到了链接,我试过了,但我没有成功。我不确定我们是否可以在编译期间访问 VM 参数,所以为了给出我试图访问的上下文,我已经提到了注释处理。
  • @Andremoniy 我正在尝试访问注释处理器中的源文件。但我无法通过镜像或反射 api 获取源路径。所以我吹捧存储源路径并在注释处理器中访问它。由于注释处理器和注释类都将在同一个 JVM 上运行,我的一位朋友建议使用 JVM 参数。因此我试图像这样访问它们。

标签: java jvm-arguments annotation-processing


【解决方案1】:

我不知道如何从注释处理器访问系统属性,但我认为注释处理器选项会支持您的用例。本质上,您希望在您的处理器中实现getSupportedOptions,通过processingEnv.getOptions 访问选项,并在命令行上使用-Aname=value 传递选项。支持的选项也可以通过@SupportedOptions 注解指定。

【讨论】:

    【解决方案2】:

    您可以使用-J 将选项传递给运行javac 的JVM,所以

    -J-Dname="hello from VM"
    

    可能会做你需要的。

    【讨论】:

      【解决方案3】:

      这适用于我在 Windows 8.1 x64 和 Java 1.8.0_05 下的 Netbeans 8.0。我只能假设它最近已修复。

          Messager cm = processingEnv.getMessager();
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          try {
              System.getProperties().storeToXML(baos, "System Properties");
          }
          catch (IOException ex) {
              cm.printMessage(Kind.ERROR, "Exception while getting System properties as XML: " + ex.getMessage());
          }
          cm.printMessage(Kind.NOTE, "\System.properties XML:\n" + baos.toString());
      

      这会给我

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
      <properties>
      <comment>System Properties</comment>
      <entry key="java.runtime.name">Java(TM) SE Runtime Environment</entry>
      <entry key="java.vm.vendor">Sun Microsystems Inc.</entry>
      ...
      </properties>
      

      jbunting 的 anwser(即使用 processingEnv.getOptions())对于将键值对干净地传递给注释处理器肯定更正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多