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
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 插件以使用蓝图,如下所示:
						
							这可让您引导您想要的任何蓝图服务,无论它们是否与 Camel 相关,还是任何其他蓝图。camel:run 目标可以自动检测 camel-blueprint 是否在类路径上,或者项目中是否有蓝图 XML 文件,因此您不必配置 useBlueprint 选项。
						
2.12.1.3. 使用有限的蓝图容器
							我们使用 Felix Connector 项目作为蓝图容器。此项目不是完整的蓝图容器。为此,您可以使用 Apache Karaf 或 Apache ServiceMix。您可以使用 applicationContextUri 配置来指定明确的蓝图 XML 文件,例如:
						
							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
cd examples/camel-example-cdi
mvn compile camel:run2.12.1.5. 日志记录 classpath
							您可以配置在 camel:run 执行时是否应该记录 classpath。您可以使用以下方法在配置中启用:
						
2.12.1.6. 使用 XML 文件的实时重新加载
您可以配置插件来扫描 XML 文件更改,并触发在这些 XML 文件中所含的 Camel 路由重新加载。
							然后,插件会监视此目录。这可让您从编辑器中编辑源代码并保存文件,并让运行的 Camel 应用程序使用这些更改。请注意,只有 Camel 路由的更改,如 < routes> , 或 <route >。您无法更改 Spring 或 OSGi Blueprint < bean> 元素。
						
2.12.2. camel:validate
为配置错误 Camel 验证源代码:* 端点 URI * 简单表达式或 predicates * 重复路由 ID
						然后,您可以从命令行或在 Java 编辑器(如 IDEA 或 Eclipse)中运行 camel:validate 目标。
					
mvn camel:validate
mvn camel:validate您还可以使插件作为构建的一部分自动运行,以捕获这些错误。
						阶段决定插件何时运行。在上面的示例中,阶段是 process-classes,它在编译主源代码后运行。也可以将 maven 插件配置为验证测试源代码,这意味着该阶段应相应地更改为 process-test-classes,如下所示:
					
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
$cd camel-example-cdi
$mvn org.apache.camel:camel-maven-plugin:2.20.0:validate然后运行并输出以下内容:
验证通过,并且验证了 4 个端点。现在,假设我们在源代码中的 Camel 端点 URI 中进行了拼写错误,例如:
@Uri("timer:foo?period=5000")
@Uri("timer:foo?period=5000")
							被修改为在 句点 选项中包含拼写错误
						
@Uri("timer:foo?perid=5000")
@Uri("timer:foo?perid=5000")当再次运行 validate 目标时,会报告以下内容:
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=true
$mvn camel:validate -Dcamel.ignoreDeprecated=true
							请注意,您必须使用 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
$cd myproject
$mvn org.apache.camel:camel-maven-plugin:2.20.0:validate -DincludeTest=true2.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 的配置中完成:
						
在运行测试时,从命令行中:
mvn clean test -DCamelTestRouteCoverage=true
mvn clean test -DCamelTestRouteCoverage=true2.12.3.3. 通过 @EnableRouteCoverage 注释启用
							如果您使用 camel-test-spring 测试,您可以通过在测试类中添加 @EnableRouteCoverage 注解来启用单元测试类中的路由覆盖:
						
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SampleCamelApplication.class)
@EnableRouteCoverage
public class FooApplicationTest {
@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;
}
@Override
public boolean isDumpRouteCoverage() {
    return true;
}
							在 RouteCoverage 方法下覆盖的路由必须具有唯一的 id,换句话说,您无法使用匿名路由。您可以使用 Java DSL 中的 routeId 完成此操作:
						
from("jms:queue:cheese").routeId("cheesy")
  .to("log:foo")
  ...
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>
<route id="cheesy">
  <from uri="jms:queue:cheese"/>
  <to uri="log:foo"/>
  ...
</route>2.12.3.5. 生成路由覆盖报告
TO 生成路由覆盖报告,运行单元测试:
mvn test
mvn test然后,您可以运行目标来报告路由覆盖,如下所示:
mvn camel:route-coverage
mvn camel:route-coverage这会报告哪些路由缺少路由覆盖和精确的源代码行报告:
							在这里,我们可以看到,第 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,然后使用其安全者将路由覆盖的数据与路由源代码匹配。因为知道哪些路由测试了哪个路由与来自源代码的路由相对应,所以使用匿名路由会变得更为安全。 |