搜索

2.12. Camel Maven 插件

download PDF

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 Example。

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

这样便可轻松启动和测试路由规则,而无需编写 main (…​)方法;它还允许您创建多个 jar 来托管不同的路由规则集合并轻松独立测试它们。Camel Maven 插件编译 maven 项目中的源代码,然后使用 classpath 上的 XML 配置文件启动 Spring ApplicationContext,网址为 META-INF/spring configured.xml。如果要更快地引导 Camel 路由,您可以尝试 camel:embedded

2.12.1.1. 选项

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

参数

默认值

描述

duration

-1

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

durationIdle

-1

设置应用程序在终止前可以闲置的空闲持续时间(秒)。值 swig 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 是否在 classpath 上,或者项目中是否有蓝图 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 的根目录中。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&gt; 被支持。您无法更改 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")

更改了在 period 选项中包含拼写错误

@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 插件 验证 目标支持以下选项,可从命令行配置(use -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. 前缀 the -D 命令参数,如 camel.ignoreDeprecated 作为选项名称。

2.12.2.3. 使用 include 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 模块,则覆盖每个测试类的 isDumpRouteCoverage 方法

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. 通过 isDumpRouteCoverage 方法启用

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

在这里,我们可以看到,在 count 列中带有 的第二行以 0,因此不涵盖它。 我们还可以在源代码文件中看到这是 34 行,它位于 my-camel.xml XML 文件中。

2.12.3.6. 选项

Camel Maven 插件 覆盖 目标支持从命令行(use -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.