Camel Maven插件支持以下目标:
- camel:run-运行您的Camel应用程序
- camel:validate-验证源代码是否包含无效的Camel端点URI
- camel:route-coverage-在单元测试后报告您的骆驼路线的覆盖范围
camel:run
camel:run
Camel Maven插件 的目标用于在Maven派生的JVM中运行Camel Spring配置。Spring Example是一个很好的入门示例应用程序。
cd examples/camel-example-spring
mvn camel:run
这使启动和测试路由规则变得非常容易,而无需编写main(…)方法; 它还使您可以创建多个jar来承载不同的路由规则集,并轻松地对其进行独立测试。Camel Maven插件编译maven项目中的源代码,然后使用位于类路径上的XML配置文件来启动Spring ApplicationContext META-INF/spring/*.xml
。如果您想更快地启动骆驼路线,可以尝试camel:embedded
改种。
选件
Camel Maven插件运行目标支持以下选项,这些选项可以从命令行配置(使用-D
语法),也可以在标记的pom.xml
文件中定义<configuration>
。
参数 | 默认值 | 描述 |
---|---|---|
持续时间 | -1 | 设置终止之前应用程序运行的持续时间(秒)。⇐0的值将永远运行。 |
durationIdle | -1 | 设置应用程序在终止之前可以空闲的空闲时间(秒)。⇐0的值将永远运行。 |
durationMaxMessages | -1 | 设置终止之前应用程序处理的最大消息数的持续时间。 |
logClasspath | 假 | 启动时是否记录类路径 |
运行OSGi蓝图
该camel:run
插件还支持运行Blueprint应用程序,默认情况下,它会扫描中的OSGi蓝图文件OSGI-INF/blueprint/*.xml
。您需要通过将useBlueprint设置为true来配置camel:run插件以使用蓝图,如下所示:
<plugin>
<groupId>org.jboss.redhat-fuse</groupId>
<artifactId>camel-maven-plugin</artifactId>
<configuration>
<useBlueprint>true</useBlueprint>
</configuration>
</plugin>
这使您可以启动所需的任何蓝图服务,无论它们是否与骆驼有关,还是其他任何蓝图。该camel:run
目标可以自动检测骆驼蓝图是否在类路径中或项目中是否有蓝图XML文件,因此您不再需要配置该useBlueprint
选项。
使用受限的蓝图容器
我们使用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
负载从类路径的文件,所以在上面的例子中myBlueprint.xml
文件必须在类路径的根。该configAdminPid
是将装载持久性文件时,可以用作PID名称配置管理服务的PID名称。的configAdminFileName
是将用于加载配置管理服务属性文件中的文件名。
运行CDI
该camel:run
插件还支持运行CDI应用程序。这使您可以启动所需的任何CDI服务,无论它们是与骆驼相关的,还是任何其他启用CDI的服务。您应该将您选择的CDI容器(例如Weld或OpenWebBeans)添加到camel-maven-plugin的依赖项中,例如本示例。从骆驼的来源,您可以运行一个CDI示例,如下所示:
cd examples/camel-example-cdi
mvn compile camel:run
记录类路径
您可以配置在camel:run
执行时是否应记录类路径。您可以使用以下命令在配置中启用它:
<plugin>
<groupId>org.jboss.redhat-fuse</groupId>
<artifactId>camel-maven-plugin</artifactId>
<configuration>
<logClasspath>true</logClasspath>
</configuration>
</plugin>
使用实时重新加载XML文件
您可以配置插件以扫描XML文件更改并触发这些XML文件中包含的Camel路由的重新加载。xml
<plugin>
<groupId>org.jboss.redhat-fuse</groupId>
<artifactId>camel-maven-plugin</artifactId>
<configuration>
<fileWatcherDirectory>src/main/resources/META-INF/spring</fileWatcherDirectory>
</configuration>
</plugin>
然后,插件监视该目录。这使您可以从编辑器中编辑源代码并保存文件,并使正在运行的Camel应用程序利用这些更改。请注意,仅支持骆驼路线的更改,例如<routes>
或<route>
支持。您不能更改Spring或OSGi Blueprint <bean>
元素。
camel:validate
用于验证配置错误的骆驼的源代码:*端点URI 简单表达式或谓词重复的路由ID
然后,您可以camel:validate
从命令行或从Java编辑器(例如IDEA或Eclipse)中运行目标。
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>
在任何Maven项目上实现目标
您也可以在任何Maven项目上运行validate目标,而不必将插件添加到pom.xml
文件中。这样做需要使用其完全限定名称指定插件。例如,要在camel-example-cdi
Apache Camel 上运行目标,您可以运行
$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] ------------------------------------------------------------------------
选件
Camel Maven插件验证目标支持以下选项,这些选项可以从命令行配置(使用-D
语法),也可以在标记的pom.xml
文件中定义<configuration>
。
参数 | 默认值 | 描述 |
---|---|---|
下载版本 | 真正 | 是否允许从互联网下载骆驼目录版本。如果项目使用的Camel版本与此插件默认使用的版本不同,则需要此选项。 |
failOnError | 假 | 如果发现无效的Camel端点是否失败。默认情况下,插件在WARN级别记录错误。 |
logUnparseable | 假 | 是否记录不可解析的端点URI,因此无法验证。 |
includeJava | 真正 | 是否包括要针对无效的Camel端点进行验证的Java文件。 |
includeXml | 真正 | 是否包括要针对无效的Camel端点进行验证的XML文件。 |
includeTest | 假 | 是否包括测试源代码。 |
包括 | 要过滤java和xml文件的名称,使其仅包括与任何给定模式列表(通配符和正则表达式)匹配的文件。多个值可以用逗号分隔。 | |
排除 | 过滤java和xml文件的名称,以排除与任何给定模式列表(通配符和正则表达式)匹配的文件。多个值可以用逗号分隔。 | |
ignoreUnknownComponent | 真正 | 是否忽略未知组件。 |
ignoreIncapable | 真正 | 是否忽略无法解析端点URI或简单表达式的信息。 |
ignoreLenientProperties | 真正 | 是否忽略使用宽大属性的组件。如果为真,则URI验证会更严格,但由于使用宽松的属性,因此对于不属于组件但位于URI中的属性将失败。例如,使用HTTP组件在端点URI中提供查询参数。 |
不推荐使用 | 真正 | Camel 2.23是否忽略端点URI中使用的不赞成使用的选项。 |
plicateRouteId | 真正 | 骆驼2.20是否验证重复的路线ID。路径ID应该是唯一的,如果重复,则Camel将无法启动。 |
directOrSedaPairCheck | 真正 | Camel 2.23是否验证发送给不存在的使用者的直接/ seda端点。 |
显示所有 | 假 | 是否显示所有端点和简单表达式(无效和有效)。 |
例如,要关闭忽略命令行中不赞成使用的选项的用法,可以运行:
$mvn camel:validate -Dcamel.ignoreDeprecated=true
请注意,您必须在-D
命令参数前面加上camel.
,例如camel.ignoreDeprecated
作为选项名称。
使用包含测试来验证端点
如果您有Maven项目,则也可以运行插件来验证单元测试源代码中的端点。您可以使用-D
如下所示的样式传递选项:
$cd myproject
$mvn org.apache.camel:camel-maven-plugin:2.20.0:validate -DincludeTest=true
Camel:路线覆盖
用于从单元测试生成有关您的骆驼路线覆盖范围的报告。您可以使用它来了解是否使用了骆驼路线的哪些部分。
启用路线覆盖
您可以通过以下方式在运行单元测试时启用路由覆盖:
- 设置为所有测试类启用的全局JVM系统属性
@EnableRouteCoverage
如果使用camel-test-spring
模块, 则对每个测试类 使用注释isDumpRouteCoverage
如果使用camel-test
模块, 则按测试类覆盖方法
通过使用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
通过@EnableRouteCoverage注释启用
@EnableRouteCoverage
如果使用camel-test-spring
以下方法进行测试,则可以 通过在测试类中添加注释来在单元测试类中启用路由覆盖:
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SampleCamelApplication.class)
@EnableRouteCoverage
public class FooApplicationTest {
通过isDumpRouteCoverage方法启用
但是,如果您正在使用camel-test
并且单元测试正在扩展,CamelTestSupport
则可以如下所示打开路由覆盖范围:
@Override
public boolean isDumpRouteCoverage() {
return true;
}
可以用RouteCoverage方法覆盖的路由必须分配一个唯一的ID,换句话说,您不能使用匿名路由。您可以routeId
在Java DSL中使用:
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>
生成路线覆盖率报告
要生成路线覆盖率报告,请使用以下命令运行单元测试:
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号最后一行to
已经0
在数列,因此不是盖的。我们还可以看到,这是my-camel.xml
XML文件中源代码文件中的第34行。
选件
Camel Maven插件覆盖目标支持以下选项,这些选项可以从命令行(使用-D
语法)进行配置,或pom.xml
在<configuration>
标记的文件中定义。
参数 | 默认值 | 描述 |
---|---|---|
failOnError | 假 | 如果任何一条路由没有100%覆盖,是否失败。 |
includeTest | 假 | 是否包括测试源代码。 |
包括 | 要过滤java和xml文件的名称,使其仅包括与任何给定模式列表(通配符和正则表达式)匹配的文件。多个值可以用逗号分隔。 | |
排除 | 过滤java和xml文件的名称,以排除与任何给定模式列表(通配符和正则表达式)匹配的文件。多个值可以用逗号分隔。 | |
匿名路由 | 假 | 是否允许匿名路由(未分配任何路由ID的路由)。通过使用路线ID,可以更安全地将路线覆盖数据与路线源代码进行匹配。匿名路由用于路由覆盖的安全性较差,因为匿名路由很难确切地知道所测试的哪个路由与源代码中的哪个路由相对应。 |