2.12. Camel Maven 插件


Camel Maven 插件支持以下目标:

  • Camel:run - 运行您的 Camel 应用程序
  • Camel:validate - 验证您的源代码以获取无效的 Camel 端点 URI
  • Camel:route-coverage - 在单元测试后报告您的 Camel 路由覆盖范围

2.12.1. camel:run

Camel Maven 插件的 camel:run 目标用于在从 Maven 派生的 JVM 中运行 Camel Spring 配置。您开始的一个很好的示例应用程序是 Spring 示例。

cd examples/camel-example-spring
mvn camel:run

这可让您在不必编写 main (…​)方法的情况下轻松启动和测试您的路由规则;它还可让您创建多个 jar 来托管不同的路由规则集合并独立测试它们。Camel Maven 插件编译 maven 项目中的源代码,然后使用位于 META-INF/spring/*.xml 的类路径上的 XML 配置文件启动 Spring ApplicationContext。如果您想更快地引导 Camel 路由,可以尝试 camel:embeed

2.12.1.1. 选项

Camel Maven 插件 运行 目标支持以下选项,这些选项可以从命令行(使用 -D 语法)或在 < configuration > 标签的 pom.xml 文件中定义。

参数

默认值

描述

duration

-1

设置应用程序在终止前运行的时间持续时间(秒)。值 TOKEN 0 将永久运行。

durationIdle

-1

设置在终止前可以闲置闲置时间(秒)持续时间。值 TOKEN 0 将永久运行。

durationMaxMessages

-1

设置应用程序在终止前的最大消息数量的持续时间。

logClasspath

false

是否在启动时记录类路径

2.12.1.2. 运行 OSGi Blueprint

camel:run 插件还支持运行 Blueprint 应用程序,默认情况下,它扫描 OSGI-INF/blueprint/*.xml 中的 OSGi 蓝图文件。您需要将 camel:run 插件配置为使用蓝图,将 useBlueprint 设置为 true,如下所示:

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>camel-maven-plugin</artifactId>
  <configuration>
    <useBlueprint>true</useBlueprint>
  </configuration>
</plugin>

这可让您启动所需的任何蓝图服务,无论它们是与 Camel 相关的,还是其它蓝图。camel:run 目标可自动检测 camel-blueprint 是否在类路径上,或者存在项目中的蓝图 XML 文件,因此您不必再配置 useBlueprint 选项。

2.12.1.3. 使用有限的 Blueprint 容器

我们使用 Felix Connector 项目作为蓝图容器。此项目不是完全创建的蓝图容器。您可以使用 Apache Karaf 或 Apache ServiceMix。您可以使用 应用程序ContextUri 配置指定明确的蓝图 XML 文件,例如:

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>camel-maven-plugin</artifactId>
  <configuration>
    <useBlueprint>true</useBlueprint>
    <applicationContextUri>myBlueprint.xml</applicationContextUri>
    <!-- ConfigAdmin options which have been added since Camel 2.12.0 -->
    <configAdminPid>test</configAdminPid>
    <configAdminFileName>/user/test/etc/test.cfg</configAdminFileName>
  </configuration>
</plugin>

applicationContextUri 从 classpath 中加载文件,因此,在 myBlueprint.xml 文件的示例中必须是 classpath 的 root 中。configAdminPid 是 pid 名称,在载入持久性属性文件时,它将用作配置 admin 服务的 pid 名称。configAdminFileName 是文件名,用于加载配置 admin 服务属性文件。

2.12.1.4. 运行 CDI

camel:run 插件也支持运行 CDI 应用程序。这可让您启动所需的任何 CDI 服务,无论它们是与 Camel 相关的,还是任何其他启用的 CDI 服务。您应该将您选择的 CDI 容器(例如 weld 或 OpenWebBeans)添加到 camel-maven-plugin 的依赖项,如本例中所示。从 Camel 来源中,您可以按照如下所示运行 CDI 示例:

cd examples/camel-example-cdi
mvn compile camel:run

2.12.1.5. 记录类路径

您可以配置在 camel:run 执行时是否应该记录 classpath。您可以在配置中启用此功能:

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>camel-maven-plugin</artifactId>
  <configuration>
    <logClasspath>true</logClasspath>
  </configuration>
</plugin>

2.12.1.6. 使用 XML 文件的实时重新加载

您可以将插件配置为扫描 XML 文件更改,并触发在这些 XML 文件中包含的 Camel 路由重新载入。

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>camel-maven-plugin</artifactId>
  <configuration>
    <fileWatcherDirectory>src/main/resources/META-INF/spring</fileWatcherDirectory>
  </configuration>
</plugin>

然后,插件会监视此目录。这可让您从编辑器中编辑源代码并保存文件,并让运行中的 Camel 应用程序使用这些更改。请注意,只有 Camel 路由的更改,如 < routes&gt;,或支持 <route >。您不能更改 Spring 或 OSGi Blueprint < bean> 元素。

2.12.2. camel:validate

对于以下 Camel 功能的源代码验证:

  • 端点 URI
  • 简单表达式或 predicates
  • 重复路由 ID

然后,您可以从命令行运行 camel:validate 目标,或者从 Java 编辑器(如 IDEA 或 Eclipse)中运行。

mvn camel:validate

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

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>camel-maven-plugin</artifactId>
  <executions>
    <execution>
      <phase>process-classes</phase>
      <goals>
        <goal>validate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

该阶段决定插件何时运行。在以上阶段的示例中,进程类 是在主源代码编译后运行的。maven 插件也可以配置为验证测试源代码,这意味着应相应地将阶段改为 process-test-classes,如下所示:

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

2.12.2.1. 在任何 Maven 项目上运行目标

您还可以在任何 Maven 项目上运行验证目标,而无需将插件添加到 pom.xml 文件中。这样做需要通过其完全限定名称指定插件。例如,若要在 Apache Camel 的 camel-example-cdi 上运行目标,您可以运行

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

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

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 2.20.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- camel-maven-plugin:2.20.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 端点 URI 中出现了拼写错误,例如:

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

被修改为在 period 选项中包含拼写错误

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

在运行验证目标时,再次报告以下内容:

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 2.20.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- camel-maven-plugin:2.20.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] ------------------------------------------------------------------------

2.12.2.2. 选项

Camel Maven 插件 验证 目标支持下列选项,可从命令行(使用 -D 语法)或在 < configuration > 标签的 pom.xml 文件中定义。

参数

默认值

描述

downloadVersion

true

是否允许从互联网下载 Camel 目录版本。如果项目使用不同于此插件的不同 Camel 版本,则需要这样做。

failOnError

false

是否在找到无效的 Camel 端点时失败。默认情况下,插件会在 WARN 级别记录错误。

logUnparseable

false

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

includeJava

true

是否包含用于无效的 Camel 端点的 Java 文件。

includeXml

true

是否包括用于无效的 Camel 端点的 XML 文件。

includeTest

false

是否包括测试源代码。

includes

 

要将 java 和 xml 文件的名称过滤为仅包含与任何给定模式列表匹配的文件(通配符和正则表达式)。可以使用逗号分隔多个值。

excludes

 

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

ignoreUnknownComponent

true

是否忽略未知组件。

ignoreIncapable

true

是否允许忽略解析端点 URI 或简单表达式。

ignoreLenientProperties

true

是否要忽略使用 lenient 属性的组件。当发生这种情况时,URI 验证更为严格,但在不属于组件的属性上会失败,但在 URI 中因为使用 lenient 属性而在 URI 中。例如,使用 HTTP 组件在端点 URI 中提供查询参数。

ignoreDeprecated

true

Camel 2.23 是否忽略端点 URI 中使用的已弃用选项。

duplicateRouteId

true

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

directOrSedaPairCheck

true

Camel 2.23 Whether 验证向非现有用户发送的直接/线端点。

showAll

false

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

例如,要关闭忽略使用命令行已弃用选项的使用,您可以运行:

$mvn camel:validate -Dcamel.ignoreDeprecated=false

请注意,您必须将 -D 命令参数加上 camel.,eg camel.ignoreDep ated 作为选项名称。

2.12.2.3. 使用 验证端点包括 test

如果您有一个 Maven 项目,您可以运行插件来验证单元测试源代码中的端点。您可以使用 -D 风格在选项中传递,如下所示:

$cd myproject
$mvn org.apache.camel:camel-maven-plugin:2.20.0:validate -DincludeTest=true

2.12.3. camel:route-coverage

在单元测试中生成 Camel 路由覆盖范围的报告。您可以使用它来了解已使用或不使用 Camel 路由的部分。

2.12.3.1. 启用路由覆盖

您可以在运行单元测试时启用路由覆盖:

  • 为所有测试类设置全局 JVM 系统属性
  • 如果使用 camel-test-spring 模块,每个测试类使用 @EnableRouteCoverage 注释
  • 如果使用 camel-test 模块,则覆盖每个测试类的DumpRouteCoverage 方法

2.12.3.2. 使用 JVM 系统属性启用路由覆盖范围

您可以打开 JVM 系统属性 CamelTestRouteCoverage,以启用对所有测试用例的路由覆盖。这可以在 maven-surefire-plugin 的配置中进行:

<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

2.12.3.3. 通过 @EnableRouteCoverage 注解启用

如果您使用 camel-test-spring 测试,可以在单元测试类中添加 @EnableRouteCoverage 注解来启用路由覆盖:

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

2.12.3.4. 通过 转储RouteCoverage 方法启用

但是,如果您使用 camel-test,而您的单元测试正在扩展 CamelTestSupport,那么您可以打开路由覆盖,如下所示:

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

可以在 RouteCoverage 方法下覆盖的路由,分配唯一的 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>

2.12.3.5. 生成路由覆盖报告

要生成路由覆盖报告,使用以下方法运行单元测试:

mvn test

然后,您可以运行这个目标来报告路由覆盖率,如下所示:

mvn camel:route-coverage

报告在精确的源代码行报告时缺少路由覆盖率:

[INFO] --- camel-maven-plugin:2.21.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 最后一行包含 0, 因此没有涵盖。我们还可以看到,源代码文件中为 34 行,它位于 my-camel.xml XML 文件中。

2.12.3.6. 选项

Camel Maven 插件 覆盖 目标支持以下选项,可从命令行(使用 -D 语法)或在 < configuration > 标签的 pom.xml 文件中定义。

参数

默认值

描述

failOnError

false

如果任何路由没有 100% 覆盖,则是否会失败。

includeTest

false

是否包括测试源代码。

includes

 

要将 java 和 xml 文件的名称过滤为仅包含与任何给定模式列表匹配的文件(通配符和正则表达式)。可以使用逗号分隔多个值。

excludes

 

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

anonymousRoutes

false

是否允许匿名路由(没有分配路由 ID 的路由)。通过使用路由 ID,其更安全地将路由覆盖数据与路由源代码匹配。匿名路由更安全地用于路由覆盖,因为难以准确了解所测试的路由与源代码路由对应的路由相对应。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.