springboot2.5编译时对java程序的约定处理

package org.springframework.boot.build;

class JavaConventions {

	void apply(Project project) {// 任务执行过程,对基础插件展开一系列处理
		project.getPlugins().withType(JavaBasePlugin.class, () -> {
			project.getPlugins().apply(TestFailuresPlugin.class); // 测试失败处理
			configureSpringJavaFormat(project); // 配置代码格式
			project.setProperty("sourceCompatibility", "1.8"); // 设置jdk兼容版本到1.8
			configureJavaCompileConventions(project); // 配置编译约定
			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", "");
				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) -> {// 定位到程序
			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程序的约定处理
本文地址:https://www.zhiletu.com/archives-10629.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

Pages: 1 2
上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微