【问题标题】:Eclipse - Annotation processor, get project pathEclipse - 注释处理器,获取项目路径
【发布时间】:2014-04-25 00:47:27
【问题描述】:

我正在为 Eclipse 构建一个注释处理器插件, 我想做的是在处理过程中检查项目文件夹中的几个文件。

我想知道如何从我的处理器中获取项目路径。 我相信可以做到这一点,因为项目源路径已提供给处理器 - 但我找不到到达它的方法。

我尝试查看 System.properties 和 processingEnv.getOptions() 但那里没有有用的信息..

最终我也想在 Netbeans 上使用这个注释处理器,所以如果有一个公共 API 可以提供这些信息,那将是最好的 - 但任何帮助将不胜感激..

【问题讨论】:

    标签: java eclipse eclipse-plugin annotation-processing


    【解决方案1】:

    处理环境为您提供了一个Filer,可用于加载(已知)资源。如果您需要绝对路径来发现文件或目录,可以使用 JavaFileManager 和 StandardLocation

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
    
    Iterable<? extends File> locations = fm.getLocation(StandardLocation.SOURCE_PATH);
    

    如果您使用的是 Eclipse,则需要 configure it to use the JDK as runtime,正如 benny 在 cmets 中指出的那样。


    似乎没有强制返回源位置的 API,因此上述解决方案无法可靠地工作,并且仅适用于某些环境。例如,文件管理器只需要支持CLASS_OUTPUTSOURCE_OUTPUT

    最简单的解决方法可能是假设/要求特定的项目结构,其中源目录和编译的类位于项目的特定子目录中(例如,大多数 IDE 的 srcbin 目录或 src/main/javatarget/classes 用于 Maven)。如果这样做,您可以通过在SOURCE_OUTPUT 位置创建一个具有Filer 的临时资源来获取源路径,并从该文件的位置获取相对源路径。

    Filer filer = processingEnv.getFiler();
    FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", "tmp", (Element[]) null);
    Path projectPath = Paths.get(resource.toUri()).getParent().getParent();
    resource.delete();
    Path sourcePath = projectPath.resolve("src")
    

    【讨论】:

    • 这在 eclipse 下对我不起作用 - ToolProvider.getSystemJavaCompiler() 从 eclipse 执行时返回 null(我认为 eclipse 使用自己的编译器不尊重这个 API)
    • 终于找到了一个解决方案——空编译器问题可以通过以下线程中的说明来修复:stackoverflow.com/questions/9107099/… -谢谢!
    • 对我来说这仍然行不通。 fm.getLocation(StandardLocation.SOURCE_PATH) 返回空值。我在 AbstractProcessor 的扩展中从 init 方法调用它。有什么提示吗?
    • 使用 maven-processor-plugin:2.2.4 对我也不起作用。 fm.getLocation(StandardLocation.SOURCE_PATH) 返回空值。只有返回不为 null 的 StandardLocations 是无用的:CLASS_PATH 包含位置 /opt/buildmanagement/hudson/slaves/slave_1/maven3-agent.jar 和 /opt/buildmanagement/hudson/tools/apache-maven-3.0.5/boot/plexus-classworlds -2.4.jar; PLATFORM_CLASS_PATH 包含一些 JAR。其余为空
    【解决方案2】:

    我通过生成源文件从ProsessingEnv获取源路径:

    String fetchSourcePath() {
        try {
            JavaFileObject generationForPath = processingEnv.getFiler().createSourceFile("PathFor" + getClass().getSimpleName());
            Writer writer = generationForPath.openWriter();
            String sourcePath = generationForPath.toUri().getPath();
            writer.close();
            generationForPath.delete();
    
            return sourcePath;
        } catch (IOException e) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Unable to determine source file path!");
        }
    
        return "";
    }
    

    【讨论】:

    • 这对我有用,而接受的答案却没有。 (但我不确定您是否需要对文件进行任何写入/打开/关闭)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多