2014-09-30 4 views
3

서비스 '클래스'중 일부를 서비스로 표시하고 해당 servicerequest를 생성하는 주석 프로세서를 작성한 자바 주석을 만들었습니다 및 서비스 처리자 클래스. 이는 GWT maven 프로젝트를위한 것으로 서비스 요청이 서버로 전송되어 중앙 디스패처로 전달되어 다양한 서비스가 처리합니다.자바 주석 프로세서에서 projectA의 주석을 읽고 처리하고 projectB의 자바 소스 파일을 생성합니다.

My maven 프로젝트는 상위 프로젝트와 5 개의 하위 모듈 프로젝트로 구성됩니다.

  • 이 MoodleMobile이 이 (부모 받는다는 프로젝트)
    • 이 gwtMoodleWS이이 (GWT 층)
    • moodleBuildSupport가 (포함 :

      프로젝트 구조는 다음과 같은 것입니다 주석 처리 R)

    • moodleGeneratedServiceHandlers 생성 된 클래스의 (원하는 위치)
    • moodleWS(서버 측 층)
    • moodleWSAPI 주석 프로세서가 실행 코드 (위치)

내 질문은 이것입니다.

주석 프로세서가 특정 프로젝트 (moodleWSAPI)에서 주석을 읽고 처리하고 다른 프로젝트 (moodleGeneratedServiceHandlers)에서 Java 소스 파일을 생성하도록 규정 된 방법은 무엇입니까?

주석 프로세서의 많은 예제가 주석 프로세서가 실행되는 동일한 프로젝트의 Java 소스 파일을 생성하는 것처럼 보입니다. 그러나 다른 프로젝트에서는 그렇지 않습니다.

주석 처리기를 성공적으로 빌드하고 테스트했지만 프로세서가 실행중인 프로젝트 외부에서 파일을 생성하는 방법을 알 수 없습니다. 현재 moodleWSAPI 내에서 Java 소스 파일을 생성 중입니다. (이것은 틀리다). moodleWSAPI에서 소스 파일을 처리 한 다음 moodleGeneratedServiceHandlers에 새로 생성 된 소스 파일을 출력하고 싶습니다. 여기

public void createSourceFileFromTemplate(Template template, ClassSignature classSignature, VelocityContext context, Element element) { 
     PrintWriter pw = null; 
     try { 
      JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(classSignature.getFullName(), classSignature.getElement()); 
      OutputStream fileStream = sourceFile.openOutputStream(); 
      pw = new PrintWriter(fileStream); 
      template.merge(context, pw); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      if (element!=null) { 
       processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(),element); 
      } else { 
       processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage()); 
      } 
     } finally { 
      if (pw!=null) { 
       pw.close(); 
      } 
     } 
    } 

주의하시기 바랍니다 .. 내가 실제 자바 소스 파일을 작성해야하는 코드입니다 : ClassSignature 내가 클래스의 클래스 이름을 캡처하는 데 사용할 그냥 내 사용자 정의 클래스입니다. 나는 Velocity를 실제 자바 소스를 생성하기위한 템플릿 엔진으로 사용한다.

processingEnv.getFiler() 스펙에 프로젝트 외부에서 출력을 지정할 수있는 내용이 없습니다.

processingEnv.getFiler(). createSourceFile (..)을 사용하지 않고 간단한 Java 파일 IO를 사용하여 Java 소스 파일을 빌드 할 수 있습니다. 이것은 쉽게 할 수 있지만, 라인 내에서 색상을 지정하고, 말하며, 규정 된 방식으로 내 필요를 충족 시키려고합니다. 어떤 아이디어?

답변

4

다른 프로젝트에서 사용할 파일을 만드는 데 특별한 API가 있다고 생각하지 않습니다. 프로세서에 관한 한 (또는 일반적으로 Java) "프로젝트"와 같은 것은 없습니다. 컴파일러에 제공되는 입력 및 출력 경로 만 알려져 있습니다.

FilerStandardLocation을 사용하면 프로세서의 이식성을 높이고 개발 환경의 디렉토리 구조에 대해 걱정할 필요가 없습니다. 프로세서가이 단일 프로젝트에서만 사용되는 경우 이러한 종류의 이식성은 실제로 필요하지 않으며 직접 파일 io를 사용하면 아무런 해가 없어야합니다. 모듈이 어떻게 구성되어 있는지 정확히 알기 때문입니다.

좀 더 관용적으로 만들려면 compiler options이라는 다른 프로젝트 소스 디렉토리의 위치를 ​​-Akey[=value] 옵션이있는 주석 프로세서에 전달할 수 있습니다. 그러면 코드에서 다른 프로젝트 구조에 대한 가정을 옮기고 해당 경로를 빌드 도구로 유지하는 책임을 전환하십시오. 메이븐 (Maven)은 프로젝트가 어쨌든 구조화되는 방식을 잘 알고 있으므로 이것이 좋은 해결책이 될 것이라고 생각합니다.

+0

나는 거기에 좋은 해결책이 있다고 생각하며 아마도 그 길로 갈 것입니다. 전체 클래스 이름을 기반으로 파일을 작성하는 코드를 작성하거나 찾아야합니다. 그것이 완료되면, 나는 경주를 떠난다. 귀하의 제안에 감사드립니다. –