Maven jdepend 循环构建失败

发布于 2024-09-13 05:08:51 字数 110 浏览 2 评论 0原文

当包循环存在时,有没有办法使用 maven 中的 jdepend 插件来使构建失败?我知道你可以用 ant 很容易地做到这一点,但我还没有弄清楚如何用 Maven 做到这一点。

谢谢, 杰夫

Is there way to use the jdepend plugin in maven to fail a build when package cycles exist? I know you can do it fairly easily with ant, but I haven't figured out how to do it with maven.

thanks,
Jeff

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

伤痕我心 2024-09-20 05:08:51

根据接受的答案,我改进了性能和日志输出,并将其发布在 Maven Central 上:

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

(我会对已接受的答案发表评论,但还没有足够的代表。)

Based on the accepted answer, I improved the performance and log output and released it on Maven Central:

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

(I'd comment on the accepted answer, but don't have enough rep yet.)

若水微香 2024-09-20 05:08:51

您可以为 maven-enforcer 插件编写自己的规则,如

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

我就是这样做的。

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>

You could write your own rule for the maven-enforcer plugin as described in

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

That's how I did it.

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 for enforcer rule:

<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>

Then you can add it to your build:

  <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>
花想c 2024-09-20 05:08:51

据我所知, JDepend Maven 插件 应该是用于生成报告,它不允许因特定规则违规而导致构建失败。

From what I can see, the JDepend Maven Plugin is supposed to be used to generate a report, it doesn't allow to fail the build on particular rules violations.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文