智慧·快乐·成长——科技造福于人。

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

package org.springframework.boot.build;

class JavaConventions {

	void apply(Project project) {// 任务执行过程,对java基础插件展开一系列处理
		project.getPlugins().withType(JavaBasePlugin.class, () -> {
			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--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) -> {// 定位到java程序
			withOptionalBuildJavaHome(project, (javaHome) -> test.setExecutable(javaHome + "/bin/"));
			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"));
	}

转载请注明:转自《springboot2.5编译时对java程序的约定处理
本文地址:https://www..com/archives-10629.html

赞赏

微信赞赏支付宝赞赏

Pages: 1 2
上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!