DHorse系列文章之maven打包

dhorse,系列,文章,maven,打包 · 浏览次数 : 39

小编点评

# 生成内容时需要带简单的排版 以下是生成内容时需要带 simple 排版的代码示例: ```java public void doPackage() { String[] commands = new String[] { "clean", "package", "-Dmaven.test.skip" }; DefaultCliRequest request = new DefaultCliRequest(commands, null); request.setWorkingDirectory("D:/hello/pom.xml"); // ...其他代码 ... // 设置其他参数 ... // 生成内容 ... // 编写简单的排版 ... } ``` 这段代码首先定义了一个 `commands`数组,包含生成内容所需的命令。然后定义了一个 `DefaultCliRequest`对象,并使用 `commands`数组作为参数传递给该对象。最后,在代码中使用 `request.setWorkingDirectory()`和`request.setProperty()`等方法设置其他参数。 对于设置其他参数的示例,可以通过如下方式添加参数: ```java request.setProperty("java.home", "D:/java/jdk-11.0.16.2"); request.setProperty("java.version", javaVesion); request.setProperty("maven.compiler.source", javaVesion); request.setProperty("maven.compiler.target", javaVesion); request.setProperty("maven.compiler.compilerVersion", javaVesion); ``` 对于编写简单的排版示例,可以根据需要添加以下代码: ```java // ...其他代码 ... // 设置其他参数 ... // 编写简单的排版 ... // 示例: // System.out.println("内容:"); // System.out.println("----------------"); ``` 最终,这段代码可以生成内容并设置其他参数,但需要根据具体需求添加参数和编写排版代码。

正文

插件打包

这种方式是平时最常用的,首先要下载并安装maven环境,然后在被打包的项目中引入插件,有各种各样的打包插件,比如springboot自带插件:

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<version>2.5.6</version>
	<configuration>
		<classifier>execute</classifier>
		<mainClass>com.test.Application</mainClass>
	</configuration>
	<executions>
		<execution>
			<goals>
				<goal>repackage</goal>
			</goals>
		</execution>
	</executions>
</plugin>

再比如,通用的打包插件:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>3.8.2</version>
	<configuration>
		<appendAssemblyId>false</appendAssemblyId>
		<descriptors>
			<descriptor>src/main/resources/assemble.xml</descriptor>
		</descriptors>
		<outputDirectory>../target</outputDirectory>
	</configuration>
	<executions>
		<execution>
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>

等等。然后再通过运行mvn clean package命令进行打包。

DHorse的技术选型

在《DHorse系列文章之镜像制作》这篇文章里已经说过,DHorse作为一个简单易用的DevOps开发平台,在一开始设计时就考虑到了对外部环境的依赖性。无论是从安装还是从使用的角度,都应该尽量减少对外部环境的依赖。
同样,打包时也应该去除对maven环境的依赖。那么,如何实现呢?
可以使用嵌入式maven插件maven-embedder来实现,首先在平台项目里引入依赖,如下:

<dependency>
	<groupId>org.apache.maven</groupId>
	<artifactId>maven-embedder</artifactId>
	<version>3.8.1</version>
</dependency>
<dependency>
	<groupId>org.apache.maven</groupId>
	<artifactId>maven-compat</artifactId>
	<version>3.8.1</version>
</dependency>
<dependency>
	<groupId>org.apache.maven.resolver</groupId>
	<artifactId>maven-resolver-connector-basic</artifactId>
	<version>1.7.1</version>
</dependency>
<dependency>
	<groupId>org.apache.maven.resolver</groupId>
	<artifactId>maven-resolver-transport-http</artifactId>
	<version>1.7.1</version>
</dependency>

运行如下代码,就可以对hello项目进行打包了:

String[] commands = new String[] { "clean", "package", "-Dmaven.test.skip" };
String pomPath = "D:/hello/pom.xml";
MavenCli cli = new MavenCli();
try {
	cli.doMain(commands, pomPath, System.out, System.out);
} catch (Exception e) {
	e.printStackTrace();
}

但是,一般情况下,我们通过maven的settings文件还会做一些配置,比如配置工作目录、nexus私服地址、Jdk版本、编码方式等等,如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
	<localRepository>C:/m2/repository</localRepository>
	<profiles>
		<profile>
			<id>myNexus</id>
			<repositories>
				<repository>
					<id>nexus</id>
					<name>nexus</name>
					<url>https://repo.maven.apache.org/maven2</url>
					<releases>
						<enabled>true</enabled>
					</releases>
					<snapshots>
						<enabled>true</enabled>
					</snapshots>
				</repository>
			</repositories>
			<pluginRepositories>
				<pluginRepository>
					<id>nexus</id>
					<name>nexus</name>
					<url>https://repo.maven.apache.org/maven2</url>
					<releases>
						<enabled>true</enabled>
					</releases>
					<snapshots>
						<enabled>true</enabled>
					</snapshots>
				</pluginRepository>
			</pluginRepositories>
		</profile>

		<profile>
			<id>java11</id>
			<activation>
				<activeByDefault>true</activeByDefault>
				<jdk>11</jdk>
			</activation>
			<properties>
				<maven.compiler.source>11</maven.compiler.source>
				<maven.compiler.target>11</maven.compiler.target>
				<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
				<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
				<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
			</properties>
		</profile>
	</profiles>
	<activeProfiles>
		<activeProfile>myNexus</activeProfile>
	</activeProfiles>
</settings>

通过查看MavenCli类发现,doMain(CliRequest cliRequest)方法有比较丰富的参数,CliRequest的代码如下:

package org.apache.maven.cli;

public class CliRequest
{
    String[] args;

    CommandLine commandLine;

    ClassWorld classWorld;

    String workingDirectory;

    File multiModuleProjectDirectory;

    boolean debug;

    boolean quiet;

    boolean showErrors = true;

    Properties userProperties = new Properties();

    Properties systemProperties = new Properties();

    MavenExecutionRequest request;

    CliRequest( String[] args, ClassWorld classWorld )
    {
        this.args = args;
        this.classWorld = classWorld;
        this.request = new DefaultMavenExecutionRequest();
    }

    public String[] getArgs()
    {
        return args;
    }

    public CommandLine getCommandLine()
    {
        return commandLine;
    }

    public ClassWorld getClassWorld()
    {
        return classWorld;
    }

    public String getWorkingDirectory()
    {
        return workingDirectory;
    }

    public File getMultiModuleProjectDirectory()
    {
        return multiModuleProjectDirectory;
    }

    public boolean isDebug()
    {
        return debug;
    }

    public boolean isQuiet()
    {
        return quiet;
    }

    public boolean isShowErrors()
    {
        return showErrors;
    }

    public Properties getUserProperties()
    {
        return userProperties;
    }

    public Properties getSystemProperties()
    {
        return systemProperties;
    }

    public MavenExecutionRequest getRequest()
    {
        return request;
    }

    public void setUserProperties( Properties properties ) 
    {
        this.userProperties.putAll( properties );      
    }
}

可以看出,这些参数非常丰富,也许可以满足我们的需求,但是CliRequest只有一个默认修饰符的构造方法,也就说只有位于org.apache.maven.cli包下的类才有访问CliRequest构造方法的权限,我们可以在平台项目里新建一个包org.apache.maven.cli,然后再创建一个类(如:DefaultCliRequest)继承自CliRequest,然后实现一个public的构造方法,就可以在任何包里使用该类了,如下代码:

package org.apache.maven.cli;

import org.codehaus.plexus.classworlds.ClassWorld;

public class DefaultCliRequest extends CliRequest{

	public DefaultCliRequest(String[] args, ClassWorld classWorld) {
		super(args, classWorld);
	}
	
	public void setWorkingDirectory(String directory) {
		this.workingDirectory = directory;
	}
}

定义好参数类型DefaultCliRequest后,我们再来看看打包的代码:

public void doPackage() {
	String[] commands = new String[] { "clean", "package", "-Dmaven.test.skip" };
	DefaultCliRequest request = new DefaultCliRequest(commands, null);
	request.setWorkingDirectory("D:/hello/pom.xml");

	Repository repository = new Repository();
	repository.setId("nexus");
	repository.setName("nexus");
	repository.setUrl("https://repo.maven.apache.org/maven2");
	RepositoryPolicy policy = new RepositoryPolicy();
	policy.setEnabled(true);
	policy.setUpdatePolicy("always");
	policy.setChecksumPolicy("fail");
	repository.setReleases(policy);
	repository.setSnapshots(policy);

	String javaVesion = "11";
	Profile profile = new Profile();
	profile.setId("java11");
	Activation activation = new Activation();
	activation.setActiveByDefault(true);
	activation.setJdk(javaVesion);
	profile.setActivation(activation);
	profile.setRepositories(Arrays.asList(repository));
	profile.setPluginRepositories(Arrays.asList(repository));

	Properties properties = new Properties();
	properties.put("java.home", "D:/java/jdk-11.0.16.2");
	properties.put("java.version", javaVesion);
	properties.put("maven.compiler.source", javaVesion);
	properties.put("maven.compiler.target", javaVesion);
	properties.put("maven.compiler.compilerVersion", javaVesion);
	properties.put("project.build.sourceEncoding", "UTF-8");
	properties.put("project.reporting.outputEncoding", "UTF-8");
	profile.setProperties(properties);
	MavenExecutionRequest executionRequest = request.getRequest();
	executionRequest.setProfiles(Arrays.asList(profile));

	MavenCli cli = new MavenCli();
	try {
		cli.doMain(request);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

如果需要设置其他参数,也可以通过以上参数自行添加。

与DHorse系列文章之maven打包相似的内容:

DHorse系列文章之maven打包

插件打包 这种方式是平时最常用的,首先要下载并安装maven环境,然后在被打包的项目中引入插件,有各种各样的打包插件,比如springboot自带插件: org.springframework.boot spring-b

DHorse系列文章之镜像制作

DHorse系列文章之镜像制作 制作镜像常用的工具 使用Docker制作镜像 1.使用docker commit制作 该命令使用比较简单,可以自行网上搜索教程。 2.使用Dockerfile制作 这种方式,需要编写如下的Dokerfile文件: FROM openjdk:openjdk:13-jdk

DHorse操作手册

在介绍DHorse的操作之前,我们先来看一下发布一个系统的流程是什么样的。 发布系统的流程 我们以一个Springboot系统为例,来说明一下发布流程。 1.首先从代码仓库下载代码,比如Gitlab; 2.接着是进行打包,比如使用Maven; 3.如果要使用k8s作为编排,还需要把步骤2产生的包制作

DHorse v1.2.1 发布,基于k8s的发布平台

# 综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用,主要特点:部署简单、操作简洁、功能快速。 # 优化内容 * 优化jvm指标收集时dhor

DHorse v1.3.0 发布,基于k8s的发布平台

# 综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用,主要特点:部署简单、操作简洁、功能快速。 # 新增特性 * 增加prometheus的配

DHorse的配置文件

首先看一下DHorse的配置文件,如下: # # 本软件遵守Apache开源许可协议2.0, # 详情见:http://www.apache.org/licenses/LICENSE-2.0 # # # Common # #服务端口,默认8100 #server.port: 8100 #系统数据文件

DHorse v1.5.1 发布,基于 k8s 的发布平台

版本说明 新增特性 支持k8s的v1.30.x版本; 优化特性 优化回滚功能; 修复注册来源的回滚问题; 新增和修改应用时校验应用名; 升级kubernetes-client至v6.13.0; 调整部署明细表头展示; 升级指南 升级指南 DHorse介绍 DHorse是一个轻量级、简单易用的云应用管

DHorse的链路追踪

目前,DHorse的链路追踪功能是通过SkyWalking来实现。实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息。下面就来具体看一下DHorse如何使用Agent的功能。 链路追踪配置 在“系统配置”菜单,打开“链路追踪模板”菜单,如图1所示:

DHorse日志收集原理

实现原理 基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar。两种方式各有优缺点,目前DHorse是基于daemoset实现的。如图1所示: 图1 在每个k8s集群中启动一个daemoset组件,即Filebeat的服务,监控/var/log/container

DHorse v1.3.2 发布,基于 k8s 的发布平台

## 版本说明 ### 新增特性 * 构建版本、部署应用时的线程池可配置化; ### 优化特性 * 构建版本跳过单元测试; ### 解决问题 * 解决Vue应用详情页面报错的问题; * 解决Linux环境下脚本运行失败的问题; * 解决下载Maven安装文件失败的问题; ### 升级说明 下载v1.