Maven 2 maven jdepend失败构建周期
当包周期存在时,有没有办法在maven中使用jdepend插件使构建失败?我知道用ant可以很容易地做到这一点,但我还不知道如何用maven做到这一点 谢谢,Maven 2 maven jdepend失败构建周期,maven-2,jdepend,Maven 2,Jdepend,当包周期存在时,有没有办法在maven中使用jdepend插件使构建失败?我知道用ant可以很容易地做到这一点,但我还不知道如何用maven做到这一点 谢谢, Jeff从我所看到的,应该用来生成报告,它不允许在特定的违反规则的情况下使构建失败。您可以为maven enforcer插件编写自己的规则,如中所述 我就是这样做的 NoPackageCyclesRule.java package org.apache.maven.enforcer.rule; import java.io.File;
Jeff从我所看到的,应该用来生成报告,它不允许在特定的违反规则的情况下使构建失败。您可以为maven enforcer插件编写自己的规则,如中所述 我就是这样做的 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>
4.0.0
习惯规则
无包周期规则
1
1
2.2.1
org.apache.maven.enforcer
强制执行器api
${api.version}
org.apache.maven
马文项目
${maven.version}
org.apache.maven
马文堆芯
${maven.version}
org.apache.maven
马文伪影
${maven.version}
org.apache.maven
maven插件api
${maven.version}
org.codehaus.plexus
丛容器默认值
1.5.5
jdepend
jdepend
2.9.1
然后,您可以将其添加到构建中:
<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>
maven enforcer插件
习惯规则
无包周期规则
1
强制执行无包周期
执行
验证
基于公认的答案,我改进了性能和日志输出,并在Maven Central上发布了它:
(我会对接受的答案发表评论,但还没有足够的代表。)不幸的是,我也发现了这一点。我希望我错过了一些东西…我用Jenkins的后期构建插件完成了,但是你的方法要简单得多。谢谢。junit测试中的assertFalse(jdepend.containsCycles())呢?在单元测试失败时使用maven enforcer有什么原因吗?如果您有一个多模块项目,JUnit测试方法不如enforcer规则那么实用。您必须将测试添加到每个模块中。请在您的答案中包含任何相关代码。这样,如果链接停止工作,您的答案可能仍然有用。另外,你应该提到你改进了什么。