2011-10-17 63 views
0

我有一個應用程序,它具有擴展org.apache.struts.StrutsActions的傳統Struts動作。我想確保所有擴展StrutsActions的類都有自定義註釋。Maven插件加載類

爲了提供這個,我寫了一個小的maven執行者規則來驗證我的需求。但是我不知道如何在我的mojo中加載我的類來驗證它們。

其實我已經做了一些不花哨的是注入outputDirectory和自定義類加載器我遞歸加載我的生成文件夾中的所有類。

謝謝

回答

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

所有的類?你是什​​麼意思 ?也許你的意思是target/classes/**(這是類的默認輸出位置),或者你是指多個目錄樹位置列表?

你能更好地解釋你的Mojo做了什麼以及你希望它與哪個階段和目標綁定。

我想也許您正在考慮如何將Maven的構建週期錯誤地應用於您的項目。你能更好地解釋你的插件做什麼,也許它是「包裝」工作?

但是,如果我理解你正確,你想插件的執行拾取目標/類/ **的額外類路徑條目?那麼它可以從項目本身加載代碼和資源來改變maven-plugin中的一些動態行爲?

執行此操作的默認方式是<dependency>但是,當然這需要一個固定單位。

允許這種行爲的其他插件(如maven-antrun-plugin)提供了一種改變Mojo內部類路徑的機制,並使用pom.xml的<configuration>部分來做到這一點。目前還不清楚你使用的插件是Maven還是你寫的插件?

驗證和包裝是一個有效的用例。但是我質疑爲什麼在「classpath」上?我猜想你對流程類階段具有約束力。

即類路徑用於向運行時提供代碼/資源以執行。但在你的情況下,你有一個輸入目錄而不是類路徑要求。

Mojo有可能在輸入目錄* /.class上設置目錄掃描器,然後可以(使用某個庫)打開每個文件並檢查註釋而不加載註釋。

這也是不可靠的輸入數據和插件代碼本身的一致行爲之間的一種很好的分離。如果一個項目決定要實現與插件本身的實現相同的包和/或類,會發生什麼情況。

更新:如果你真的從你的Mojo中加載你檢查到的JVM類,那麼至少應該實現你自己的ClassLoader。這不一定是一個簡單的問題要解決。您可以使此ClassLoader從輸入目錄中的配置中找到指定的內容。

+0

我已經更新了我的問題,以更好地解釋。 – Cemo