2010-08-05 125 views
3

有沒有辦法在maven中使用jdepend插件來在包循環存在時失敗構建?我知道你可以很容易地用螞蟻做到這一點,但我還沒有想出如何用螞蟻做到這一點。maven jdepend失敗與循環構建

感謝, 傑夫

回答

4

http://maven.apache.org/enforcer/enforcer-api/writing-a-custom-rule.html

這就是我是如何做到的描述你可以寫爲Maven的實施者插件您自己的規則。

NoPackageCyclesRule.java

package org.apache.maven.enforcer.rule; 

import java.io.File; 
import java.io.IOException; 

import jdepend.framework.JDepend; 

import org.apache.maven.enforcer.rule.api.EnforcerRule; 
import org.apache.maven.enforcer.rule.api.EnforcerRuleException; 
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; 
import org.apache.maven.plugin.logging.Log; 
import org.apache.maven.project.MavenProject; 
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; 

public class NoPackageCyclesRule implements EnforcerRule 
{ 

    public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException 
    { 
     Log log = helper.getLog(); 

     try 
     { 
      MavenProject project = (MavenProject) helper.evaluate("${project}"); 
      File targetDir = new File((String) helper.evaluate("${project.build.directory}")); 
      File classesDir = new File(targetDir, "classes"); 

      if (project.getPackaging().equalsIgnoreCase("jar") && classesDir.exists()) 
      { 
       JDepend jdepend = new JDepend(); 
       jdepend.addDirectory(classesDir.getAbsolutePath()); 
       jdepend.analyze(); 

       if (jdepend.containsCycles()) 
       { 
        throw new EnforcerRuleException("There are package cycles"); 
       } 
      } 
      else 
      { 
       log.warn("Skipping jdepend analysis as " + classesDir + " does not exist."); 
      } 
     } 
     catch (ExpressionEvaluationException e) 
     { 
      throw new EnforcerRuleException("Unable to lookup an expression " 
        + e.getLocalizedMessage(), e); 
     } 
     catch (IOException e) 
     { 
      throw new EnforcerRuleException("Unable to access target directory " 
        + e.getLocalizedMessage(), e); 
     } 
    } 

    public String getCacheId() 
    { 
     return ""; 
    } 

    public boolean isCacheable() 
    { 
     return false; 
    } 

    public boolean isResultValid(EnforcerRule arg0) 
    { 
     return false; 
    } 
} 

的pom.xml的執法規則:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>custom-rule</groupId> 
    <artifactId>no-package-cycles-rule</artifactId> 
    <version>1.0</version> 

    <properties> 
    <api.version>1.0</api.version> 
    <maven.version>2.2.1</maven.version> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>org.apache.maven.enforcer</groupId> 
     <artifactId>enforcer-api</artifactId> 
     <version>${api.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-project</artifactId> 
     <version>${maven.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-core</artifactId> 
     <version>${maven.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-artifact</artifactId> 
     <version>${maven.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-plugin-api</artifactId> 
     <version>${maven.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.plexus</groupId> 
     <artifactId>plexus-container-default</artifactId> 
     <version>1.5.5</version> 
    </dependency> 
    <dependency> 
     <groupId>jdepend</groupId> 
     <artifactId>jdepend</artifactId> 
     <version>2.9.1</version> 
    </dependency> 
    </dependencies> 

</project> 

然後你就可以將其添加到您的構建:

<plugin> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <dependencies> 
     <dependency> 
     <groupId>custom-rule</groupId> 
     <artifactId>no-package-cycles-rule</artifactId> 
     <version>1.0</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
     <id>enforce-no-package-cycles</id> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     <phase>verify</phase> <!-- use a phase after compile! --> 
     <configuration> 
      <rules> 
      <NoPackageCyclesRule 
       implementation="org.apache.maven.enforcer.rule.NoPackageCyclesRule" /> 
      </rules> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
+0

我用Jenkins的後期構建插件做了它,但你的方式更簡單。謝謝。 – 2011-05-14 19:44:30

+0

在junit測試中assertFalse(jdepend.containsCycles())呢?是否有理由在未通過單元測試時使用Maven執行者? – Jay 2012-07-17 01:28:07

+0

如果您有多模塊項目,則JUnit-Test方法不像實施規則那麼實用。您將不得不將測試添加到每個模塊。 – 2012-07-23 09:40:29

1

從我所看到的,JDepend Maven Plugin應該被用來生成一個報告,它不允許失敗的特定規則違反構建。

+0

不幸的是我的發現爲好。希望我失蹤的東西... – 2010-08-16 12:52:52

5

基於公認的答案,我改進了性能和日誌輸出,並在Maven Central上發佈:

https://github.com/andrena/no-package-cycles-enforcer-rule

(我上公認的答案發表評論,但沒有足夠的代表呢。)

+2

請在您的答案中包含任何相關代碼。這樣,如果鏈接停止工作,您的答案可能仍然有用。另外,你應該提及你的改進。 – Ren 2013-05-13 08:43:15