서비스 '클래스'중 일부를 서비스로 표시하고 해당 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 소스 파일을 빌드 할 수 있습니다. 이것은 쉽게 할 수 있지만, 라인 내에서 색상을 지정하고, 말하며, 규정 된 방식으로 내 필요를 충족 시키려고합니다. 어떤 아이디어?
나는 거기에 좋은 해결책이 있다고 생각하며 아마도 그 길로 갈 것입니다. 전체 클래스 이름을 기반으로 파일을 작성하는 코드를 작성하거나 찾아야합니다. 그것이 완료되면, 나는 경주를 떠난다. 귀하의 제안에 감사드립니다. –