【问题标题】:Integrate jQAssistant in Maven build using profile and running server使用配置文件和运行服务器在 Maven 构建中集成 jQAssistant
【发布时间】:2021-06-30 16:56:19
【问题描述】:

我正在尝试将 jQAssistant 集成到我现有的 Maven 构建中。我有一个 POM 层次结构,但基本上顶级 POM 定义了构建的功能。这就是我的<pluginManagement> 和我一直使用的构建插件的地方。我还有一些用于特殊构建的 Maven 配置文件。

所以,我想在构建期间扫描所有类,并将结果汇​​总到正在运行的服务器中,以便在构建所有 Maven 模块后拥有一个完全填充的 Neo4J 数据库。数据库应该包含我的整个代码库。

分析和检查将是一个不同的步骤,我不想在构建 Maven 模块时直接这样做。

我看到的例子都是建立一个本地数据库,然后对照它检查类。据我了解,我必须将服务器作为守护进程运行,然后配置 Maven 插件以使用“bolt”URI 来填充它 - 对吗?

此外,由于我不想减慢“正常”构建的速度,因此我添加了一个 Maven 配置文件来激活 jQAssistant 扫描。但是,这仅适用于我的顶级 POM,但不适用于任何其他 Maven 项目/模块。配置文件的继承是一个正常且预期的 Maven 功能 - 那么我做错了什么?

这是我的父 POM。为了查看配置文件是否处于活动状态,我还添加了 PMD:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <packaging>pom</packaging>
  <groupId>foo</groupId>
  <artifactId>parent</artifactId>
  <version>1.50.0-SNAPSHOT</version>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>com.buschmais.jqassistant</groupId>
          <artifactId>jqassistant-maven-plugin</artifactId>
          <version>1.5.0</version>
          <configuration>
            <useExecutionRootAsProjectRoot>true</useExecutionRootAsProjectRoot>
          </configuration>
        </plugin>
    </pluginManagement>
  </build>

    <profile>
      <id>architecture</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <executions>
              <execution>
                <phase>validate</phase>
                <goals>
                  <goal>pmd</goal>
                  <goal>cpd</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>com.buschmais.jqassistant</groupId>
            <artifactId>jqassistant-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>scan</id>
                <goals>
                  <goal>scan</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

</project>

当我在具有父 POM 的 Maven 项目上运行 mvn clean package -P architecture 时,我看到以下输出,这表明配置文件处于活动状态:

09:30:12.316 [INFO] 
09:30:12.316 [INFO] --- maven-pmd-plugin:3.5:pmd (default) @ util-type ---
09:30:15.073 [INFO] 
09:30:15.073 [INFO] --- maven-pmd-plugin:3.5:cpd (default) @ util-type ---
09:30:15.976 [INFO] 

但是,jqassistant-maven-plugin 不存在。

现在,如果我将它添加到我的普通 &lt;build&gt; 插件中:

<build>
  <plugins>
    <plugin>
      <groupId>com.buschmais.jqassistant</groupId>
      <artifactId>jqassistant-maven-plugin</artifactId>
      <executions>
        <execution>
          <id>scan</id>
          <goals>
            <goal>scan</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

然后我看到我的 父 POMmvn clean package 的以下输出:

10:38:14.252 [INFO] --- jqassistant-maven-plugin:1.5.0:scan (scan) @ parent ---
10:38:15.684 [INFO] Loaded jQAssistant plugins [CDI, Common, Core Analysis, Core Report, EJB3, GraphML, JAX-RS, JPA 2, JSON, JUnit, Java, Java 8, Java EE 6, Maven 3, OSGi, RDBMS, Spring, TestNG, Tycho, XML, YAML].
10:38:15.952 [INFO] Connecting to store at 'file:/C:/jp/maven-parents/parent/target/jqassistant/store/'
10:38:20.058 [INFO] Initializing embedded Neo4j server 3.x
10:38:20.078 [INFO] Resetting store.
10:38:21.515 [INFO] Reset finished (removed 8453 nodes, 29427 relations).
10:38:22.372 [INFO] Entering C:/jp/maven-parents/parent/target/failsafe-reports
10:38:22.378 [INFO] Leaving C:/jp/maven-parents/parent/target/failsafe-reports (1 entries, 4 ms)

但是,在我的 Maven 项目中,我没有看到任何 jQAssistant 输出。

mvn help:effective-pom -Parchitecture 开始,父项目和 Maven 模块的输出相同:

  <plugin>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.5</version>
    <executions>
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>pmd</goal>
          <goal>cpd</goal>
        </goals>
        <configuration>
          ...
        </configuration>
      </execution>
    </executions>
    <configuration>
      ...
    </configuration>
  </plugin>
  <plugin>
    <groupId>com.buschmais.jqassistant</groupId>
    <artifactId>jqassistant-maven-plugin</artifactId>
    <version>1.5.0</version>
    <executions>
      <execution>
        <id>scan</id>
        <goals>
          <goal>scan</goal>
        </goals>
        <configuration>
          <useExecutionRootAsProjectRoot>true</useExecutionRootAsProjectRoot>
        </configuration>
      </execution>
    </executions>
    <configuration>
      <useExecutionRootAsProjectRoot>true</useExecutionRootAsProjectRoot>
    </configuration>
  </plugin>

【问题讨论】:

    标签: maven jqassistant


    【解决方案1】:

    在我的项目中,我有一个带有以下插件管理部分的父 POM:

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.buschmais.jqassistant</groupId>
                    <artifactId>jqassistant-maven-plugin</artifactId>
                    <version>${jqassistant.version}</version>
                    <configuration>
                        <useExecutionRootAsProjectRoot>true</useExecutionRootAsProjectRoot>
                    </configuration>
    
                    <executions>
                        <execution>
                            <id>scan</id>
                            <goals>
                                <goal>scan</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>analyze</id>
                            <goals>
                                <goal>analyze</goal>
                            </goals>
                            <configuration>
                                <failOnSeverity>MAJOR</failOnSeverity>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
            </plugins>
        </pluginManagement>
    </build>
    

    我还定义了以下配置文件,用于运行 jQAsssistant:

    <profile>
        <id>verify-architecture</id>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>com.buschmais.jqassistant</groupId>
                    <artifactId>jqassistant-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </profile>
    

    使用mvn -P verify-archicture clean install我可以扫描和分析我的项目。

    【讨论】:

    • 谢谢!我试过这个,但由于某种原因,它在我的构建中不起作用。在正常构建中调用插件时,它可以工作,但不能在配置文件中。
    • 没有您的项目设置很难找到问题。是公共项目吗?
    • 这看起来像是 Maven 项目设置中的问题。只是为了避免误解:在你的父 pom 中的 pluginManagement 旁边还有一个插件本身的声明?你在命令行上执行什么?你能把你设置的一些sn-ps放在这里吗?
    • 项目未公开,抱歉!我试图记录正在发生的事情(见上文)。不知何故,插件的执行没有从父 POM 继承到 Maven 项目。
    • 您能否在您的子项目中执行mvn help:effective-pom -Pyour-profile 并验证jQA Maven 插件是否在那里激活?否则:您能否将您的设置简化为显示问题的(匿名)演示示例?
    【解决方案2】:

    几年后我们到了 :-)

    回到我的错误!

    这里的问题是 Maven 阶段。 jQAssistant 插件 Mojo scan 默认具有 Maven 阶段 post-integration-test

    但是,我们公司从不使用 mvn clean install,我们只使用 mvn clean package 并使用 Jenkins、Nexus 等进行安装。

    所以,没有强制插件进入package 阶段是我的错。

    这就是它的工作原理:

    <profile>
      <id>jqassistant</id>
      <build>
        <plugins>
          <plugin>
            <groupId>com.buschmais.jqassistant</groupId>
            <artifactId>jqassistant-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>scan-software</id>
                <phase>package</phase>
                <goals>
                  <goal>scan</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 1970-01-01
      • 2016-10-13
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多