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>
; 或支持 & 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
Deprecated 作为选项名称。
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. 生成路由覆盖报告
要生成路由覆盖范围报告,使用以下命令运行单元测试:
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,其安全器与路由源代码中的数据匹配。匿名路由不安全地使用路由覆盖范围,因为它更难以知道哪个路由被测试与源代码中哪个路由对应。 |