前言
目前有个项目需要一个类似于AI相关的巨大分词包,这个文件不能通过git提交,因为公司git服务器限制了文件大小,且这个文件有人在维护更新,只能通过在打包的时候实时下载,就有了这个maven package时需要下载文件的需求,打包的时候需要将这个分词包放进最终打完的包中。
pom.xml
不废话,直接上代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itdct.dpd</groupId>
<artifactId>download-package-demo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dep</id>
<phase>prepare-package</phase>
<goals>
<goal>
copy-dependencies
</goal>
</goals>
</execution>
</executions>
<configuration>
<includeScope>runtime</includeScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>download-http-file</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target name="download-file">
<java classname="com.itdct.dpd.DownloadData">
<classpath>
<!-- 指定项目的编译输出路径 -->
<pathelement location="${project.build.outputDirectory}" />
</classpath>
</java>
<java classname="com.itdct.dpd.DownloadDataWithHutool">
<classpath>
<!-- 指定项目的编译输出路径 -->
<pathelement location="${project.build.outputDirectory}" />
<!-- 指定所需jar包的路径 -->
<fileset dir="${project.build.directory}/dependency">
<include name="*.jar"/>
</fileset>
</classpath>
</java>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
代码说明
第一个dependency插件,用于获取所有依赖到的jar包,并输出到target/dependency目录下。
由于都是在package阶段执行的,谁在的顺序优先谁先执行,因此这个dependency插件会优先于AntRun插件执行。
主要执行自己的java任务的是AutRun插件,意思是“运行Ant任务”,Ant的名字来源于“Another Neat Tool”
AntRun插件中通过target标签指定需要执行的任务,这里用的是java任务。通过pathelement中的location指定classpath,这里指定的就是target/class目录,让AntRun插件找到你的代码比如我这里的是com.itdct.dpd.DownloadData这个类。
如果需要引用类,可以指定jar包所在目录,比如我这里的
<fileset dir="${project.build.directory}/dependency">
<include name="*.jar"/>
</fileset>
相当于将上一步dependency收集到的jar包全部引用到了,不然会出现java.lang.NoClassDefFoundError这个报错
下载文件的代码
这里只放com.itdct.dpd.DownloadDataWithHutool这个类,采用hutool进行下载文件。另外的com.itdct.dpd.DownloadData这个类就是自己用代码实现,不用任何jar包引用的,由于实现比较复杂,就不放出来了。
@Slf4j
public class DownloadDataWithHutool {
public static void main(String[] args) {
String resultFileName = "llama-customization-3.1.tar.gz";
HttpUtil.downloadFile("http://127.0.0.1/" + resultFileName, new File(resultFileName), new StreamProgress() {
private long lastPrintProgressTime = 0L;
@Override
public void start() {
log.info("开始下载" + resultFileName);
}
@Override
public void progress(long total, long progressSize) {
if (System.currentTimeMillis() - lastPrintProgressTime < 1000) {
return;
}
String percent = new BigDecimal(100.0 * progressSize / total).setScale(2, RoundingMode.HALF_UP).toString();
log.info("进度为:" + percent + "%");
lastPrintProgressTime = System.currentTimeMillis();
}
@Override
public void finish() {
log.info(resultFileName + "下载完成");
}
});
}
}
这样在执行maven的package命令的时候就会自动下载文件到项目的根目录,具体什么目录可以在下载方法里自己写。这样这个需求就解决了。
实现结果
为了保密,文件打码了