获取工作目录的文件路径

时间:2014-10-03 13:48:54

标签: java android annotation-processing

我为android项目编写了一个注释处理器。我想得到orroids资源文件夹的绝对路径(我知道它可以通过gradle配置,但我暂时忽略了这种情况)。

我的想法是获取已处理元素的绝对路径:

@MyAnnotation public class Foo{ ... }

因此,在我的AnnotationProcessor中,我希望获得Foo.java的路径。

  @Override public boolean process(Set<? extends TypeElement> annotations,
      RoundEnvironment roundEnv) {

    for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class))

      try {
        ProcessorMessage.info(element, "Path: %s %s", getWorkingDir(), getExecutionPath());
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        ProcessorMessage.error(element, "Error " + e.getMessage());
      }

    return false;
  }

  private String getExecutionPath() throws UnsupportedEncodingException {
    String path = AnnotatedAdapterProcessor.class.getProtectionDomain()
        .getCodeSource()
        .getLocation()
        .getPath();
    String decodedPath = URLDecoder.decode(path, "UTF-8");

    return decodedPath;
  }

  private String getWorkingDir() {
    Path currentRelativePath = Paths.get("");
    String s = currentRelativePath.toAbsolutePath().toString();
    return s;
  }

然而,它给了我以下输出:

路径:/Users/XXXXX/.gradle/daemon/1.12 /Users/XXXXX/.m2/repository/com/example/myprocessor/processor/0.1.2-SNAPSHOT/processor-0.1.2-SNAPSHOT.jar < / p>

有没有办法获得Foo.java所在的路径? (只是为了从我将继续开始搜索资源文件夹的地方获得一个起点)

1 个答案:

答案 0 :(得分:0)

我认为这些路径可能取决于您的构建环境,如果您手动构建它们,它们可能无法在每台计算机或每台IDE上运行。 这个问题可能有所帮助:Annotation processor, get project path

如果这不起作用,我认为你仍然在那里正确,但是应该尝试使用实际资源而不是为处理器加载的类,如下所示:

String path = Foo.class.getProtectionDomain().getCodeSource().getLocation().getPath();

我不确定这一切是否也适用于处理器的上下文,但一般情况下这应该为您提供类文件的根输出目录:

String path = Foo.class.getClassLoader().getResource(".").getFile();

如果您知道输出目录例如在your_project/target/classes中,则可以使用该目录获取源或资源目录。