这是用户在 2024-3-28 22:00 为 https://camel.apache.org/manual/camel-report-maven-plugin.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?


骆驼报告 maven 插件


骆驼报告 Maven 插件支持以下目标


  • camel-report:validate - 验证源代码中是否存在无效的 Camel 端点 uris


  • camel-report:route-coverage - 在单元测试后报告 Camel 路由的覆盖率

 骆驼报告:验证


用于验证错误配置的 Camel 源代码:

  •  终端 uris


  • 简单表达式或谓词

  •  路由标识重复


  • seda/direct 端点对


  • 属性文件中的配置


然后,您可以通过命令行或 IDEA 或 Eclipse 等 Java 编辑器运行 validate 目标。

mvn camel-report:validate


您也可以在构建过程中启用插件自动运行,以捕捉这些错误。

<plugin>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-report-maven-plugin</artifactId>
  <executions>
    <execution>
      <phase>process-classes</phase>
      <goals>
        <goal>validate</goal>
      </goals>
    </execution>
  </executions>
</plugin>


阶段决定插件的运行时间。在上面的示例中, process-classes 阶段在主源代码编译后运行。


还可以将 maven 插件配置为验证测试源代码,这意味着如下所示,阶段应相应改为 process-test-classes

<plugin>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-report-maven-plugin</artifactId>
  <executions>
    <execution>
      <configuration>
        <includeTest>true</includeTest>
      </configuration>
      <phase>process-test-classes</phase>
      <goals>
        <goal>validate</goal>
      </goals>
    </execution>
  </executions>
</plugin>


在任何 maven 项目上运行目标


您也可以在任何 Maven 项目上运行验证目标,而无需在 pom.xml 文件中添加插件。这样做需要使用插件的完整限定名称来指定插件。例如,要在 Apache Camel 的 camel-example-cdi 上运行目标,可以运行

$cd camel-example-cdi
$mvn org.apache.camel:camel-report-maven-plugin:2.20.0:validate


然后运行并输出以下内容:

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 3.0.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- camel-report-maven-plugin:3.0.0:validate (default-cli) @ camel-example-cdi ---
[INFO] Endpoint validation success: (4 = passed, 0 = invalid, 0 = incapable, 0 = unknown components)
[INFO] Simple validation success: (0 = passed, 0 = invalid)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------


验证通过了,4 个端点也通过了验证。现在假设我们在源代码中的某个 Camel 端点 uris 中打错了字,例如

@Uri("timer:foo?period=5000")


选项中的一个错字。

@Uri("timer:foo?perid=5000")


再次运行 validate 目标时,报告如下:

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 3.0.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- camel-report-maven-plugin:3.0.0:validate (default-cli) @ camel-example-cdi ---
[WARNING] Endpoint validation error at: org.apache.camel.example.cdi.MyRoutes(MyRoutes.java:32)

	timer:foo?perid=5000

	                   perid    Unknown option. Did you mean: [period]


[WARNING] Endpoint validation error: (3 = passed, 1 = invalid, 0 = incapable, 0 = unknown components)
[INFO] Simple validation success: (0 = passed, 0 = invalid)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

 选项


maven 插件验证目标支持以下选项,这些选项可通过命令行配置(使用 -D 语法),或在 pom.xml 文件中的 <configuration> 标记中定义。

 参数

 默认值

 说明

 下载版本

 


是否允许从互联网下载 Camel 目录版本。如果项目使用的 Camel 版本与本插件默认使用的不同,则需要执行此操作。

failOnError

 错误


如果发现无效的 Camel 端点,是否判定失败。默认情况下,插件会以 WARN 级别记录错误。

 覆盖阈值

100


使用 failOnError 时的最小路由覆盖率(百分比)。

 总体覆盖阈值

0


使用 failOnError 时所有路由的最小覆盖率(百分比)。

logUnparseable

 错误


是否记录无法解析因而无法验证的端点 URI。

includeJava

 


是否包含要对无效 Camel 端点进行验证的 Java 文件。

includeXml

 


是否包含要对无效 Camel 端点进行验证的 XML 文件。

 包含测试

 错误


是否包含测试源代码。

 包括


过滤 java 和 xml 文件名,使其只包含与给定模式(通配符和正则表达式)列表中的任一模式匹配的文件。可使用逗号分隔多个值。

 不包括


过滤 java 和 xml 文件名,以排除与给定模式(通配符和正则表达式)列表中的任何模式匹配的文件。可使用逗号分隔多个值。

 忽略未知组件

 


是否忽略未知组件。

 忽略无能

 


是否忽略无法解析的端点 uri 或简单表达式。

 忽略简化属性

 


是否忽略使用宽松属性的组件。如果设置为 "true",uri 验证会更严格,但由于使用了宽松属性,uri 中不属于组件的属性会被忽略。例如,使用 HTTP 组件在端点 uri 中提供查询参数。

 忽略旧版

 


是否忽略端点 uri 中使用的过时选项。

 重复路由标识

 


是否验证路由 ID 是否重复。路由 ID 应该是唯一的,如果存在重复,Camel 将无法启动。

 直接或间接配对检查

 


是否验证向非现有消费者发送的 direct/seda 端点。

 配置文件

 应用程序属性


要验证的配置文件的位置。默认为 application.properties。多个值可用逗号分隔,并使用通配符模式匹配。

 显示全部

 错误


是否显示所有端点和简单表达式(包括无效和有效)。


下载过渡性艺术品

 错误


当声明了 sourcesArtifacts 时,此标记可用于下载传递依赖关系,请谨慎启用此标记,因为它会尝试下载整个依赖关系树。

 来源文物


包含骆驼路由的源传递依赖项列表,该选项可用于下载项目可能依赖的包含骆驼路由的额外依赖项。

extraMavenRepositories


额外的 maven 资源库列表。


例如,要从命令行打开忽略使用已废弃选项的功能,可以运行

$mvn camel-report:validate -Dcamel.ignoreDeprecated=true


请注意,必须在 -D 命令参数前加上 camel. 。,例如 camel.ignoreDeprecated 作为选项名称。

 验证包括测试


如果您有一个 Maven 项目,那么也可以运行该插件来验证单元测试源代码中的端点。如图所示,您可以使用 -D 样式传递选项:

$cd myproject
$mvn org.apache.camel:camel-report-maven-plugin:3.0.0:validate -Dcamel.includeTest=true


在传递依赖关系中验证 apache camel 路由


如果您的路由使用了当前项目中不存在的 directseda 端点,但这些路由被声明为项目的依赖关系,那么您可以相应地编辑插件配置,以便 Camel 验证插件可以考虑这些路由。特别是,为了使用具有传递依赖关系的验证插件,需要使用源 jars,例如


  • 给定当前项目中定义的以下 Camel 路由 from("direct:in").to("direct:out")


  • 路由 from("direct:out") 被声明为项目的依赖关系,例如 my.company:routes-dependency:1.0


  • 如果将 routes-dependency 源代码发布到 maven 代码库中,可使用以下插件配置:

<plugin>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-report-maven-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>validate</goal>
      </goals>
      <configuration>
        <sourcesArtifacts>
          <sourcesArtifact>my.company:routes-dependency:jar:sources:1.0</sourcesArtifact>
        </sourcesArtifacts>
        <extraMavenRepositories>
          <extraMavenRepository>http://internal.repo:8080/maven</extraMavenRepository>
        </extraMavenRepositories>
      </configuration>
    </execution>
  </executions>
</plugin>

camel-report:route-coverage


用于从单元测试中生成 Camel 路由覆盖率报告。与生成 Java 代码覆盖率报告的方式相同,该报告也适用于 Camel 路由。因此,您可以用它来了解 Camel 路由的哪些部分已被使用或未被使用。


Camel 使用 JMX 捕获测试期间的指标,用于计算路由覆盖率。您的类路径中必须有 camel-management JAR(可以是测试作用域),例如在 pom.xml 文件中声明以下 Maven 依赖关系:

<!-- JMX is needed for route coverage testing -->
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-management</artifactId>
    <scope>test</scope>
</dependency>

 实现航线覆盖


在运行单元测试时,您可以通过以下任一方式启用路由覆盖:


  • 设置启用所有测试类的全局 JVM 系统属性


  • 如果使用 camel-test-spring-junit5 模块,则每个测试类使用 @EnableRouteCoverage 注释


  • 如果使用 camel-test 模块,每个测试类重载 isDumpRouteCoverage 方法


通过 jvm 系统属性启用


您可以打开 JVM 系统属性 CamelTestRouteCoverage 以启用所有测试用例的路由覆盖。这可以在 maven-surefire-plugin .JVM 系统属性 {{2}} 的配置中完成:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <systemPropertyVariables>
      <CamelTestRouteCoverage>true</CamelTestRouteCoverage>
    </systemPropertyVariables>
  </configuration>
</plugin>


或在运行测试时从命令行输入:

mvn clean test -DCamelTestRouteCoverage=true


通过 @enableroutecoverage 注释启用


您需要在单元测试类中启用路由覆盖。如果使用 camel-test-spring-junit5 进行测试,则可以在测试类中添加 @EnableRouteCoverage 注解:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SampleCamelApplication.class)
@EnableRouteCoverage
public class FooApplicationTest {


通过 isdumproutecoverage 方法启用


但是,如果您使用的是 camel-test ,而单元测试扩展了 CamelTestSupport ,则可以如图所示打开路由覆盖:

@Override
public boolean isDumpRouteCoverage() {
    return true;
}


可进行路由覆盖的路由必须有一个唯一 ID,换句话说,不能使用匿名路由。


您可以使用 Java DSL 中的 routeId 来实现这一功能:

from("jms:queue:cheese").routeId("cheesy")
  .to("log:foo")
  ...


在 XML DSL 中,您只需通过 id 属性指定路由 id

<route id="cheesy">
  <from uri="jms:queue:cheese"/>
  <to uri="log:foo"/>
  ...
</route>


生成航线覆盖报告


在使用

mvn test


然后您就可以运行目标,报告路线覆盖情况

mvn camel-report:route-coverage


然后,通过精确的源代码行报告功能,报告哪些路由缺少路由覆盖:

[INFO] --- camel-camel-report-plugin:3.0.0:route-coverage (default-cli) @ camel-example-spring-boot-xml ---
[INFO] Discovered 1 routes
[INFO] Route coverage summary:

File:	src/main/resources/my-camel.xml
RouteId:	hello

  Line #      Count   Route
  ------      -----   -----
      28          1   from
      29          1     transform
      32          1     filter
      34          0       to
      36          1     to

Coverage: 4 out of 5 (80.0%)


在这里,我们可以看到倒数第 2 行的 to 的计数列中有 0 ,因此不包括在内。我们还可以看到,这是源代码文件中的第 34 行,位于 my-camel.xml XML 文件中的第 34 行。

 选项


maven 插件覆盖目标支持以下选项,这些选项可通过命令行配置(使用 -D 语法),或在 pom.xml 文件的 <configuration> 标记中定义。

 参数

 默认值

 说明

failOnError

 错误


如果任何一条路线的覆盖率不是 100%,是否会失败。

 包含测试

 错误


是否包含测试源代码。

 包括


过滤 java 和 xml 文件的名称,使其只包含与给定模式(通配符和正则表达式)列表中的任一模式匹配的文件。可使用逗号分隔多个值。

 不包括


过滤 java 和 xml 文件名,以排除与给定模式(通配符和正则表达式)列表中的任何模式匹配的文件。可使用逗号分隔多个值。

 匿名路线

 错误


是否允许匿名路由(未指定任何路由 ID 的路由)。使用路由 ID 可以更安全地将路由覆盖数据与路由源代码相匹配。匿名路由用于路由覆盖的安全性较低,因为很难准确知道哪条路由与源代码中的哪条路由相对应。

 生成 JacocoXmlReport

 错误


是否以 Jacoco XML 格式生成覆盖率报告。启用后将生成文件: target/site/jacoco/xmlJacoco.xml

 生成 HtmlReport

 错误


是否生成 HTML 格式的覆盖率报告。启用后将生成文件: target/site/route-coverage/html/index.html