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 的 fork JVM 中运行 Camel Spring 配置。您开始的一个很好的示例应用程序是 Spring 示例。

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

这使得启动和测试路由规则非常容易,而无需编写 main (…​)方法;它还允许您创建多个 jar 来托管不同的路由规则,并易于独立测试。Camel Maven 插件编译 maven 项目中的源代码,然后使用位于 META-INF/spring2023.xml 的类路径上的 XML 配置文件引导 Spring ApplicationContext。如果要更快地引导 Camel 路由,您可以尝试 camel:embedded

2.12.1.1. 选项

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

参数

默认值

描述

duration

-1

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

durationIdle

-1

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

durationMaxMessages

-1

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

logClasspath

false

启动时是否记录 classpath

2.12.1.2. 运行 OSGi Blueprint

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

<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。您可以使用 applicationContextUri 配置来指定明确的蓝图 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. 日志记录 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; , 或 <route >。您无法更改 Spring 或 OSGi Blueprint < bean> 元素。

2.12.2. camel:validate

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

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

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

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>

阶段决定插件何时运行。在上面的示例中,阶段是 process-classes,它在编译主源代码后运行。也可以将 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 项目中运行 validate 目标,而无需将插件添加到 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")

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

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

当再次运行 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 ---
[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 验证更为严格,但会针对不属于组件的属性失败,但因为使用了 lenient 属性,所以在 URI 中会失败。例如,使用 HTTP 组件在端点 URI 中提供查询参数。

ignoreDeprecated

true

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

duplicateRouteId

true

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

directOrSedaPairCheck

true

Camel 2.23 是否验证发送到非现有用户的直接/seda 端点。

showAll

false

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

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

$mvn camel:validate -Dcamel.ignoreDeprecated=false

请注意,您必须使用 camel.-D 命令参数添加前缀,例如 camel.ignore 已弃用

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. 生成路由覆盖报告

TO 生成路由覆盖报告,运行单元测试:

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 行 排在 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.