Java 在编译时访问VM参数

Java 在编译时访问VM参数,java,jvm-arguments,annotation-processing,Java,Jvm Arguments,Annotation Processing,我在访问程序中的VM参数时遇到问题。我正在编写一个注释处理器,希望在其中访问一些VM参数。我正在使用NETBeans IDE。我创建注释处理器的jar文件,然后在另一个项目中使用它,该项目包含带有注释的java文件 现在在我的注释处理器项目中,我在IDE中设置VM参数,如下所示 -Dname="hello from VM" 当我试图访问它时,在注释处理器的process()函数中 String property = System.getProperty("name"); System.out

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

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

-Dname="hello from VM"
当我试图访问它时,在注释处理器的process()函数中

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

System.out.println(property);
它打印空。 当注释处理器和注释类在同一个VM中运行时,我们可以在编译时访问这些VM参数吗?
谢谢

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

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

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

-J-Dname="hello from VM"

可能会执行您需要的操作。

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

-J-Dname="hello from VM"

可能会满足您的要求。

这对我来说适用于使用Java 1.8.0的Windows 8.1 x64下的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>

系统属性
Java(TM)SE运行时环境
太阳微系统公司。
...

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

这对我来说适用于Windows 8.1 x64和Java 1.8.0下的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>

系统属性
Java(TM)SE运行时环境
太阳微系统公司。
...

jbunting(即使用processingEnv.getOptions())的anwser显然更适合将键值对干净地传递给注释处理器。

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