当前位置: 首页 > news >正文

JAVA后端程序拉取私人仓库的npm包并将该程序打包成jar包

        当前有一个系统用于导出项目,而每次导出的项目并不可以直接使用,需要手动从npm私人仓库中获取一个npm包然后将他们整合到一起它才是一个完整的项目,所以目前我的任务就是编写一个java程序可以自动地从npm私人仓库拉取下来那个模板代码到指定地路径上去。并且我还要将这个java程序打包成jar包上传到先前创建好的maven私有仓库中去,这样可以在pom.xml中引入即可使用。

HttpClient

        Apache HttpClient 是一个用于发送 HTTP 请求的客户端库,常用于 Java 应用程序中处理 HTTP 请求和响应。

        有很多种方式可以让HttpClien连接你的项目,并依靠它去写代码。 最简单的方式也许就是使用 Maven 。你可以通过在你的 pom.xml 文件里的 标签中增加像下面这样的片段来完成这个整合。

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> <!-- 确保使用合适的版本 --></dependency>

        这样之后,再在程序中将它引入即可以使用。

import org.apache.http.auth.AuthScope;import org.apache.http.auth.UsernamePasswordCredentials;import org.apache.http.client.CredentialsProvider;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicCredentialsProvider;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.util.EntityUtils;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;

JAVA程序

        接下来是编写java程序,我创建了以下代码的java程序。

package org.example;import org.apache.http.auth.AuthScope;import org.apache.http.auth.UsernamePasswordCredentials;import org.apache.http.client.CredentialsProvider;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicCredentialsProvider;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.util.EntityUtils;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;public class NpmDownloader {private static final String REPO_URL = "http://localhost/repository/yb-npm/";private static final String PACKAGE_NAME = "@yunbin/yunbin-ui";private static final String VERSION = "1.0.0";private static final String USERNAME = "admin";private static final String PASSWORD = "admin123";private static final String DOWNLOAD_DIR = "E:/ideaProjects/CloneNpm/src/main/directory"; // e.g., "C:/downloads"public static void main(String[] args) {try {downloadNpmPackage(REPO_URL, PACKAGE_NAME, VERSION, USERNAME, PASSWORD, DOWNLOAD_DIR);} catch (IOException e) {e.printStackTrace();}}public static void downloadNpmPackage(String REPO_URL, String packageName, String version, String USERNAME, String PASSWORD, String DOWNLOAD_DIR) throws IOException {String encodedPackageName = URLEncoder.encode(packageName, StandardCharsets.UTF_8.toString());// 构建正确的包下载路径String url = REPO_URL + encodedPackageName + "/-/" + packageName.substring(packageName.indexOf('/') + 1) + "-" + version + ".tgz";// 创建下载目录(如果不存在)File downloadDir = new File(DOWNLOAD_DIR);if (!downloadDir.exists()) {if (!downloadDir.mkdirs()) {throw new IOException("Failed to create directory: " + DOWNLOAD_DIR);}}CredentialsProvider credsProvider = new BasicCredentialsProvider();credsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(USERNAME, PASSWORD));try (CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credsProvider).build()) {HttpGet request = new HttpGet(url);try (CloseableHttpResponse response = client.execute(request)) {if (response.getStatusLine().getStatusCode() == 200) {try (InputStream inputStream = response.getEntity().getContent();OutputStream outputStream = new FileOutputStream(DOWNLOAD_DIR + "/" + packageName.substring(packageName.indexOf('/') + 1) + "-" + version + ".tgz")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}System.out.println("Package downloaded successfully.");} else {System.out.println("Failed to download package. Status code: " +response.getStatusLine().getStatusCode());}}}}}

打包成jar包

        直接运行mvn deploy就可以将该项目打包成jar包并上传到私人仓库中去。(maven的私人仓库地址和仓库认证如何配置就不在这里介绍。)

测试程序(如何使用)

        创建了一个测试程序,在其中的pom.xml文件中引入已经打包好的jar包(引入的仓库地址配置在settings.xml中,在这里也不过多赘述。)

        在程序中编写好以下代码,然后点击运行。

package org.example;import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {String REPO_URL = "http://localhost:8081/repository/yb-npm/";String PACKAGE_NAME = "@yunbin/yunbin-ui";String VERSION = "1.0.0";String USERNAME = "admin";String PASSWORD = "admin123";String DOWNLOAD_DIR = "E:/ideaProjects/testCloneNpm/src/main/directory"; // e.g., "C:/downloads"NpmDownloader.downloadNpmPackage(REPO_URL,PACKAGE_NAME,VERSION,USERNAME,PASSWORD,DOWNLOAD_DIR);}}

        即可看见在目标文件夹中拉取到了目标私人仓库中的代码,这里要注意,在设置DOWNLOAD_DIR的时候,所存的目标文件夹可以不存在程序会自动创建该文件夹,根据该路径将拉取下来的npm包存储到该目标文件夹中,如果该文件夹里已有内容,程序会依据同名覆盖的原则进行覆盖。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++学习笔记----4、用C++进行程序设计(五)---- 非复合与继承关系
  • react中的useCallback、useMemo、useRef 和 useContext
  • TypeScript 面试题汇总
  • 多系统萎缩不慌张,这些维生素是你的“守护神”✨
  • RabbitMQ(面试篇)
  • qt圆环饼状图,非常小的窗口都能显示
  • 探索AI大模型量化前沿技术:引领智能计算新潮流
  • SD Maid SE v1.2.3 — 老牌清理工具全面升级,更简洁,更流畅了
  • 如何使用 SQL Server 内置函数实现MD5加密
  • WebSocket的应用场景与案例解析
  • 自然语言处理系列三十三》 语义相似度》同义词词林》算法原理
  • 构建高效的串行任务执行器:SerialExecutor深度解析
  • 长视频生成研究的挑战、方法与前景
  • Nginx知识详解(理论+实战更易懂)
  • 浏览器非安全端口号
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android Volley源码解析
  • HomeBrew常规使用教程
  • Java程序员幽默爆笑锦集
  • LeetCode18.四数之和 JavaScript
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Linux中的硬链接与软链接
  • MySQL几个简单SQL的优化
  • nginx 配置多 域名 + 多 https
  • Python利用正则抓取网页内容保存到本地
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 程序员最讨厌的9句话,你可有补充?
  • 简单易用的leetcode开发测试工具(npm)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 少走弯路,给Java 1~5 年程序员的建议
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 通过调用文摘列表API获取文摘
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #70结构体案例1(导师,学生,成绩)
  • #Linux(权限管理)
  • #pragma 指令
  • #QT(一种朴素的计算器实现方法)
  • #数据结构 笔记三
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)虚拟机的安装与使用,linux系统安装
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (四)React组件、useState、组件样式
  • (一)appium-desktop定位元素原理
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core WebAPI中封装Swagger配置
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net8 Blazor 尝鲜
  • /deep/和 >>>以及 ::v-deep 三者的区别