如何构建含自定义HttpLogModifier实现的Karate独立Jar包?
解决自定义HttpLogModifier的Karate可执行Jar构建问题
1. 调整源码目录结构
将自定义的DemoLogModifier.java从src/test/java/headers移动到src/main/java/headers——Maven默认不会将测试目录(src/test/java)的类打包到主Jar包中,调整后才能确保自定义类被包含在最终的可执行Jar里。
调整后的目录结构:
$ ls -R . pom.xml src ./src: main test ./src/main: java ./src/main/java: headers ./src/main/java/headers: DemoLogModifier.java ./src/test: java ./src/test/java: karate-config.js logback-test.xml
2. 修改pom.xml配置
需要配置Maven插件构建包含所有依赖的可执行Fat Jar,同时指定Karate的主类。推荐用maven-shade-plugin处理依赖冲突并打包所有必要类,在pom.xml的<build>标签下添加以下配置:
<build> <plugins> <!-- 编译插件,根据你的Java版本调整source/target --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> <!-- Shade插件构建可执行Fat Jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 指定Karate主类 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.intuit.karate.Main</mainClass> </transformer> </transformers> <!-- 处理签名文件避免冲突 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>
同时确保pom.xml包含Karate核心依赖:
<dependencies> <dependency> <groupId>com.intuit.karate</groupId> <artifactId>karate-core</artifactId> <version>1.4.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.intuit.karate</groupId> <artifactId>karate-junit5</artifactId> <version>1.4.1</version> <scope>test</scope> </dependency> </dependencies>
3. 确保HttpLogModifier实现正确
自定义类需完整实现com.intuit.karate.http.HttpLogModifier接口,示例如下:
package headers; import com.intuit.karate.http.HttpLogModifier; import com.intuit.karate.http.HttpRequest; import com.intuit.karate.http.HttpResponse; public class DemoLogModifier implements HttpLogModifier { @Override public String modifyRequestLog(HttpRequest request) { // 自定义请求日志掩码逻辑,比如替换敏感字段 return request.getLog().replaceAll("\"password\":\"[^\"]+\"", "\"password\":\"***\""); } @Override public String modifyResponseLog(HttpResponse response) { // 自定义响应日志掩码逻辑 return response.getLog().replaceAll("\"token\":\"[^\"]+\"", "\"token\":\"***\""); } }
4. 构建并运行可执行Jar
执行打包命令:
mvn clean package打包完成后,
target目录下会生成格式为{project-name}-{version}-shaded.jar的可执行Fat Jar。运行Jar并指定Feature文件:
java -jar target/your-project-name-1.0-SNAPSHOT-shaded.jar path/to/your/feature/file.feature启用自定义日志修改器,需通过系统属性指定全限定类名:
java -Dkarate.http.log.modifier=headers.DemoLogModifier -jar target/your-project-name-1.0-SNAPSHOT-shaded.jar path/to/your/feature/file.feature
关键注意点
- 自定义类必须放在
src/main/java目录,否则Maven打包时不会将其纳入主Jar。 - 普通Maven Jar仅包含自身代码,用
maven-shade-plugin才能将Karate依赖和自定义类打包为单一可执行Jar,解决主类找不到、依赖缺失的问题。
内容的提问来源于stack exchange,提问作者Jon Detert
相关产品推荐
相关产品推荐

