springboot2.5编译时对java程序的约定处理
package org.springframework.boot.build;
class JavaConventions {
void apply(Project project) {// 任务执行过程,对java基础插件展开一系列处理
project.getPlugins().withType(JavaBasePlugin.class, (java) -> {
project.getPlugins().apply(TestFailuresPlugin.class); // 测试失败处理
configureSpringJavaFormat(project); // 配置java代码格式
project.setProperty("sourceCompatibility", "1.8"); // 设置jdk兼容版本到1.8
configureJavaCompileConventions(project); // 配置java编译约定
configureJavadocConventions(project); // 配置javadoc的约定
configureTestConventions(project); // 配置测试约定
configureJarManifestConventions(project); // 配置生成jar的清单文件约定
configureDependencyManagement(project); // 配置依赖管理
});
}
/**
* 提取项目的jar清单下的约定配置
* @param project
*/
private void configureJarManifestConventions(Project project) {
// 创建法律声明资源文件提取任务
ExtractResources extractLegalResources = project.getTasks().create("extractLegalResources",
ExtractResources.class);
// 获取资源提取的目标路径,并重设置为法律声明文件目录
extractLegalResources.getDestinationDirectory().set(project.getLayout().getBuildDirectory().dir("legal"));
// 设置资源提取的资源名称集:许可证和版权通知
extractLegalResources.setResourcesNames(Arrays.asList("LICENSE.txt", "NOTICE.txt"));
// 设置资源提取时要用到的一个属性:version,设置值为当前项目的版本号
extractLegalResources.property("version", project.getVersion().toString());
// 获取项目资源集
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
// 通过资源集获取源代码包任务名集
Set sourceJarTaskNames = sourceSets.stream().map(SourceSet::getSourcesJarTaskName)
.collect(Collectors.toSet());
// 通过资源集获取Javadoc包任务名集
Set javadocJarTaskNames = sourceSets.stream().map(SourceSet::getJavadocJarTaskName)
.collect(Collectors.toSet());
// jar包组装
project.getTasks().withType(Jar.class, (jar) -> project.afterEvaluate((evaluated) -> {
// 给jar包添加版权声明信息,并放在META-INF下
jar.metaInf((metaInf) -> metaInf.from(extractLegalResources));
// 给jar包生成清单信息
jar.manifest((manifest) -> {
Map attributes = new TreeMap<>();
attributes.put("Automatic-Module-Name", project.getName().replace("-", "."));
attributes.put("Build-Jdk-Spec", project.property("sourceCompatibility"));
attributes.put("Built-By", "Spring");
attributes.put("Implementation-Title",
determineImplementationTitle(project, sourceJarTaskNames, javadocJarTaskNames, jar));
attributes.put("Implementation-Version", project.getVersion());
manifest.attributes(attributes);
});
}));
}
/**
* 实现名称裁决
* @param project
* @param sourceJarTaskNames
* @param javadocJarTaskNames
* @param jar
* @return
*/
private String determineImplementationTitle(Project project, Set sourceJarTaskNames,
Set javadocJarTaskNames, Jar jar) {
if (sourceJarTaskNames.contains(jar.getName())) {
return "Source for " + project.getName();
}
if (javadocJarTaskNames.contains(jar.getName())) {
return "Javadoc for " + project.getName();
}
return project.getDescription();
}
private void configureTestConventions(Project project) {
project.getTasks().withType(Test.class, (test) -> {// 定位到java程序
withOptionalBuildJavaHome(project, (javaHome) -> test.setExecutable(javaHome + "/bin/java"));
test.useJUnitPlatform();
test.setMaxHeapSize("1024M");
});
project.getPlugins().apply(TestRetryPlugin.class);
project.getTasks().withType(Test.class,
(test) -> project.getPlugins().withType(TestRetryPlugin.class, (testRetryPlugin) -> {
TestRetryTaskExtension testRetry = test.getExtensions().getByType(TestRetryTaskExtension.class);
testRetry.getFailOnPassedAfterRetry().set(true);
testRetry.getMaxRetries().set(isCi() ? 3 : 0);
}));
}
private boolean isCi() {// 判定是否是脚手架环境
return Boolean.parseBoolean(System.getenv("CI"));
}
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《springboot2.5编译时对java程序的约定处理》
本文地址:http://www.xiupu.net/archives-10629.html
关注公众号:
微信赞赏
支付宝赞赏
