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

2.12.1.1. 选项

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

参数

默认值

描述

duration

-1

设置应用程序在终止前所运行的时间持续时间(秒)。系统会永久运行值 InventoryService 0。

durationIdle

-1

设置应用程序在终止前可以闲置的空闲时间(秒)持续时间。系统会永久运行值 InventoryService 0。

durationMaxMessages

-1

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

logClasspath

false

是否在启动时记录类路径

2.12.1.2. 运行 OSGi 蓝图

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. 使用有限的蓝图容器

我们使用 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>

应用程序ContextUri 从 classpath 加载文件,因此在 myBlueprint.xml 文件上方的示例中必须位于 classpath 的根目录中。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. 记录 classpath

您可以配置当 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; 或支持 & lt;route >。您无法更改 Spring 或 OSGi Blueprint < bean> 元素。

2.12.2. camel:validate

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

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

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

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 属性的组件。当此参数为 true 时,如果 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 是否验证发送到非现有消费者的直接/横线端点。

showAll

false

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

例如,要禁用在命令行中弃用的选项的使用,您可以运行:

$mvn camel:validate -Dcamel.ignoreDeprecated=false

请注意,您必须将 -D 命令参数前缀为 camel。,eg camel. ignore Deprecated 作为选项名称。

2.12.2.3. 使用验证端点包括测试

如果您有 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. 通过DumpRouteCoverage 方法启用

但是,如果您使用 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%)

在这里,我们可以看到,使用 的第二代行在 count 栏中具有 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.