2011-10-17 1 views
0

org.apache.struts.StrutsActions를 확장하는 레거시 Struts 액션이있는 애플리케이션이 있습니다. StrutsActions를 확장하고있는 모든 클래스가 커스텀 어노테이션을 가지고 있는지 확인하고 싶습니다.Maven 플러그인로드 클래스

나는 이것을 제공하기 위해 필자의 요구 사항을 검증하기 위해 작은 maven enforcer 규칙을 작성했습니다. 그러나 나는 그들을 확인하는 내 모조에서 내 수업을로드하는 방법을 몰라.

실제로 나는 injectionDirectionory 인 fancy가 아니며 사용자 정의 클래스 로더를 사용하여 모든 클래스를 내 빌드 폴더에 재로드했습니다.

감사

답변

0

나는 reflections

<dependency> 
    <groupId>org.reflections</groupId> 
    <artifactId>reflections</artifactId> 
    <version>0.9.5</version> 
    </dependency> 

내 구현의 도움으로 그것을 짓을 다음과 같이이다 :

public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { 

    URL url = getURL(helper.evaluate("${project.build.outputDirectory}")); 

    Predicate<String> filter = new FilterBuilder().include(getTargetSuperTypeForSubtypes()); 
    Predicate<String> filter2 = new FilterBuilder().include(getMustHaveAnnotation()); 

    Reflections reflections = new Reflections(new ConfigurationBuilder() 
    .setScanners(
     new TypeAnnotationsScanner().filterResultsBy(filter2), 
     new SubTypesScanner().filterResultsBy(filter)) 
    .setUrls(url)); 

    validate(reflections); 
} 
0

모든 클래스는? 그게 무슨 뜻 이니 ? 어쩌면 당신은/classes/** (클래스의 기본 출력 위치입니다) 또는 여러 디렉토리 트리 위치 목록을 의미할까요?

Mojo가 수행하는 작업과 바인딩 할 단계 및 목표를 더 잘 설명 할 수 있습니까?

아마도 Maven의 빌드주기를 프로젝트에 잘못 적용하는 방법을 생각하고있을 것입니다. 당신의 플러그인이하는 일을 더 잘 설명해 주시겠습니까? 아마도 "패키징"작업일까요?

정확하게 이해한다면 플러그인의 실행으로 인해 대상/클래스/**에 대한 추가 클래스 경로 항목을 가져오고 싶습니까? 그래서 Maven-Plugin 내부에서 동적 인 동작을 변경하기 위해 프로젝트 자체에서 코드와 리소스를로드 할 수 있습니까?

기본 방법은 <dependency>이지만 물론 고정 단위가 필요합니다.

이 동작을 허용하는 다른 플러그인 (예 : maven-antrun-plugin)은 모조 내부의 클래스 경로를 변경하고 pom.xml의 <configuration> 섹션에서 무언가를 사용하여이를 수행합니다. 사용하고있는 플러그인이 Maven 또는 작성한 플러그인인지 확실하지 않습니다.

.

유효한 사용 케이스 인 유효성 및 패키징. 그러나 나는 왜 "classpath"에서 질문을 하는가? 나는 당신이 프로세스 - 클래스 단계에서 구속력을 가지고 있다고 생각할 것이다.

즉, 클래스 경로는 실행 시간에 코드/리소스를 제공하기위한 것입니다. 그러나 귀하의 경우에는 클래스 경로 요구 사항이 아닌 입력 디렉토리가 있습니다.

Mojo에서 입력 디렉토리 * / .class에 디렉토리 스캐너를 설치 한 다음 각 파일을 열어 (일부 라이브러리를 사용하여) 주석 파일을로드하지 않고 검사 할 수 있습니다.

신뢰할 수없는 입력 데이터와 플러그인 코드 자체의 일관된 동작을 구분하는 좋은 방법이기도합니다. 프로젝트가 플러그인 자체의 구현에 사용 된 것과 동일한 패키지 및/또는 클래스를 구현하기로 결정하면 어떻게됩니까?

업데이트 : 실제로 Mojo에서 JVM으로 체크인하는 클래스를로드하는 경우 적어도 자신의 ClassLoader를 구현하여 구현하십시오. 이것은 반드시 해결해야 할 간단한 문제는 아닙니다. 이 ClassLoader는 입력 디렉토리의 구성에서 지정된 항목을 찾습니다.

+0

내가 더 잘 설명하는 내 질문에 업데이트되었습니다. – Cemo