需求

  • 这里讲的是nexus3做为maven私服服务器,下载某个仓库下的所有jar包(带文件夹,就是与maven本地仓库一样的结构),以代理仓库为例:下载代理仓库下所有的jar包

思路

  1. 我们平时用到的开源jar包都会在代理仓库缓存一份,直接找到代理仓库的文件夹,很可惜没找到。
  2. 找到所有pom.xml文件的dependency引用,然后利用maven下载到本地,此时代理仓库已经jar包了,下载不会太慢。下面针对这个思路进行简单描述:使用java语言,利用jsoup解析页面获取想要的内容(算不算爬虫呢)

实现

  1. 利用jsoup解析页面,解析第一页就是:ip:port/service/rest/repository/browse/代理仓库名/,这个页面好解析,好操作,点击文件夹进入下一级目录页面恰好就是原来url地址加上文件夹的名字,直到最后一层漏出xxx.pom和xxx.jar,点击xxx.pom进入页面,获取页面指定节点的内容,拼凑成dependency引用结构,就是我们想要的。
  2. 找到要解析的页面:
    1. 进入nexus3首页
    2. 进入代理仓库页面:此页面也不错,但是不好解析,解析路径获取不到想要的内容
    3. 点击HTML View进入文件列表页(列出的就是该仓库所有的jar包,当然找到jar包得一层一层进入)
    4. 直到最后一层,找到xxx.pom,此时链接地址为:ip:port/service/rest/repository/browse/test-proxy/antlr/antlr/2.7.2/
    5. 点击xxx.pom,注意此时链接地址结构改变了,变成:ip:port/repository/test-proxy/antlr/antlr/2.7.2/antlr-2.7.2.pom,与之前变化。此时页面有我们想要的东西:project子节点groupId,artifactId,version,这些恰好是dependency引用三点定位需要的内容。有些页面比较乱,project会有parent子节点,groupId和version节点可能会在parent子节点里
    6. 将我们取得的内容按照dependency引用的规则拼接字符串就可以:
      <dependency><groupId>antlr</groupId><artifactId>antlr</artifactId><version>2.7.2</version></dependency>

代码(使用Jsoup解析页面)

package com.gw.safe.utils;import org.apache.poi.util.DocumentHelper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;/*** Test** @author shuai* @date 2019/8/12*/public class Test2 {public static final Logger log = LoggerFactory.getLogger(Test2.class);public static void main(String[] args) throws Exception {/*** 获取dependencyList*/List<String> dependencyList = getDependencyList("http://ip:port/service/rest/repository/browse/仓库名/", "http://ip:port/repository/仓库名/");/*** 美化输出pom.xml文件(文件,控制台)*/create(dependencyList);}/*** 获取私服 dependencyList** @param url           要解析的第一页* @param dependencyUrl 点击.pom文件后页面路径有所变化,变化后的路径(去掉最后一层/xxx.pom)* @return* @throws Exception*/public static List<String> getDependencyList(String url, String dependencyUrl) throws Exception {List<String> list = new ArrayList<>();//静态页面链接地址Document doc = Jsoup.connect(url).userAgent("Mozilla").timeout(4000).get();if (doc != null) {Elements elements = doc.select("table>tbody>tr>td>a");if (elements != null && elements.size() > 0) {for (Element element : elements) {String uri = element.text() + "/";getDependencyList(list, url, dependencyUrl, uri);}}}return list;}/*** 解析第二页开始的之后数个子页(递归),直到看见xxx.pom文件认为路径已经到底了** @param list* @param url* @param dependencyUrl* @param uri* @throws Exception*/private static void getDependencyList(List<String> list, String url, String dependencyUrl, String uri) throws Exception {try {Document doc = Jsoup.connect(url + uri).userAgent("Mozilla").timeout(4000).get();if (doc != null && doc.hasText()) {Elements elements = doc.select("table>tbody>tr>td>a");if (elements != null && elements.size() > 0) {String pomUri = null;Boolean flagPom = false;Boolean flagJar = false;for (int i = 1; i < elements.size(); i++) {//查看当前页有无xxx.pomif (elements.get(i).text() != null && elements.get(i).text().endsWith(".pom")) {pomUri = elements.get(i).text();flagPom = true;}//查看当前页有无xxx.jar,没有xxx.jarif (elements.get(i).text() != null && elements.get(i).text().endsWith(".jar")) {flagJar = true;}}/** 有xxx.pom说明路径解析已经到底了,如果没有xxx.jar(少量)也不必解析xxx.pom了,下载不下来。* 没有xxx.pom继续路径解析*/if (flagPom) {if (flagJar) {if (pomUri != null) {String pomUrl = dependencyUrl + uri + pomUri;String dependency = getDependency(pomUrl);list.add(dependency);}}} else {for (int i = 1; i < elements.size(); i++) {getDependencyList(list, url, dependencyUrl, uri + elements.get(i).text() + "/");}}}}} catch (Exception e) {System.out.println("无法解析:" + url + uri);}}/*** 解析xxx.pom,组装dependency字符串** @param pomUrl* @return* @throws Exception*/private static String getDependency(String pomUrl) throws Exception {Document pom = Jsoup.connect(pomUrl).userAgent("Mozilla").timeout(4000).get();/*** 多数情况下会在project的子节点找到dependency三点定位的属性值,version和groupId属性值可能在project子节点parent下。*/Element artifactId = pom.select("project>artifactId").get(0);Element version = null;Elements versions = pom.select("project>version");if (versions != null && versions.size() > 0) {version = versions.get(0);} else {version = pom.select("project>parent>version").get(0);}Element groupId = null;Elements groupIds = pom.select("project>groupId");if (groupIds != null && groupIds.size() > 0) {groupId = groupIds.get(0);} else {groupId = pom.select("project>parent>groupId").get(0);}/*** 组装我们想要的字符串。*/String dependencyFormat = "<dependency><groupId>{0}</groupId><artifactId>{1}</artifactId><version>{2}</version></dependency>";String dependency = MessageFormat.format(dependencyFormat, groupId.text(), artifactId.text(), version.text());log.info("dependency->{}", dependency);return dependency;}/*** 输出pom.xml结构(文件,控制台)** @param dependencyList* @throws Exception*/public static void create(List<String> dependencyList) throws Exception {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();org.w3c.dom.Document document = DocumentHelper.createDocument();org.w3c.dom.Element project = document.createElement("project");project.setAttribute("xmlns", "http://maven.apache.org/POM/4.0.0");project.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");project.setAttribute("xsi:schemaLocation", "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd");org.w3c.dom.Element modelVersion = document.createElement("modelVersion");modelVersion.setTextContent("4.0.0");org.w3c.dom.Element dependencies = document.createElement("dependencies");for (String dependency : dependencyList) {org.w3c.dom.Document doc = builder.parse(new InputSource(new StringReader(dependency)));org.w3c.dom.Element element = doc.getDocumentElement();dependencies.appendChild(document.adoptNode(element));}project.appendChild(modelVersion);project.appendChild(dependencies);document.appendChild(project);/*** 创建转换工厂,然后将创建的document转换输出到文件中或控制台*/TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();/*** 美化输出*/transformer.setOutputProperty(OutputKeys.INDENT, "yes");transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes");transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");/*** 保存到文件*/transformer.transform(new DOMSource(document), new StreamResult(new File("F:\\n-pom.xml")));/*** 将document中的信息转换为字符串输出到控制台中*/StringWriter stringWriter = new StringWriter();transformer.transform(new DOMSource(document), new StreamResult(stringWriter));System.out.println(stringWriter.toString());}}

jsoup依赖

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version>
</dependency>

下载maven私服所有jar包相关推荐

  1. IntelliJ IDEA 中无法下载Maven仓库源代码jar包到本地

    场景:IDEA maven项目中导入spring-boot包坐标,下载后项目没报错,但是ctrl +鼠标 死活无法点击到内部看父依赖,但是老版本包坐标却可以,百思不得其解, 打开本地仓库下载文件夹,对 ...

  2. 通过 Maven 命令将 jar 包推送到私服

    文章目录 通过 Maven 命令将 jar 包推送到私服 1. 命令 2. 命令选项说明 2.1. 选项:-DgroupId 2.2. 选项:-DartifactId 2.3. 选项:-Dversio ...

  3. nexus : maven上传jar包到nexus私服后的存放路径以及保存的数据结构

    文章目录 1.美图 2.背景 1.美图 2.背景 因为要上传我的所有仓库的包,希望nexus中已有的包,我不覆盖,没有的添加.所以想批量上传jar.所以想知道这些jar都存放在哪里了? maven上传 ...

  4. Oracle ojdbc6-11.2.0.3.jar下载以及Maven手动安装jar包

    Oracle ojdbc6-11.2.0.3.jar下载以及Maven手动安装jar包 1.下载ojdbc6-11.2.0.3.jar 百度网盘下载地址 提取码:提取码:9es5 2.手动安装ojdb ...

  5. maven导入第三方jar包

    这个第三方jar包,是不能在私服或者公共通用的mavan服务器上下载的jar包. 第一步:将第三方jar包放入项目根目录下,即与pom文件同意层级 第二步:maven导入第三方jar包 第三步:选中项 ...

  6. 【Maven】将jar包手动打到本地仓库

    上一篇博客中写到了,在maven的setting.xml文件中通过做如下的配置,可以绕过私服直接从中央仓库去下载所需的jar包,同时更正上一篇博客中一个小小的不足,在<profile>标签 ...

  7. Maven 手动添加 JAR 包到本地仓库

    转载自:http://www.blogjava.net/fancydeepin/archive/2012/06/12/380605.html Maven 手动添加 JAR 包到本地仓库 Maven 确 ...

  8. Maven工程引入jar包(转)

    Maven项目引入jar包的方法,希望能帮助有需要的朋友们 法一.手动导入:项目右键->Build Path->Configure Build Path->选中Libraries-& ...

  9. maven打本地JAR包

    本文来说下maven如何打本地JAR包 文章目录 概述 使用命令cmd 本文小结 概述 在跑一个程序的时候,发现项目报错了,无法从maven仓库中下载一个JAR包,上网查找资料之后,发现原来这是一个第 ...

最新文章

  1. Escape Time II 简单的深搜dfs()
  2. xx学OD -- 消息断点 RUN跟踪(下)
  3. 通过分析 JDK 源代码研究 Hash 存储机制
  4. STM32 基础系列教程 48 – CJSON
  5. Crawler:基于urllib库获取cn-proxy代理的IP地址
  6. 不停应用重启oracle数据库,此类情况下解决Oracle数据库重启的四种方案
  7. 通过服务器端日志分析WebSocket的server和client交互
  8. 信息学奥赛一本通 1009:带余除法 | OpenJudge NOI 1.3 04
  9. IP釋放、清除、以及刷新DNS
  10. TCP滑动窗口机制深度剖析
  11. MapReduce Example
  12. LapStyle - 基于拉普拉斯金字塔的高质量风格化方法 | CVPR2021
  13. Python 爬取留言板留言(一):单进程版+selenium模拟
  14. Ubuntu20.04安装mujoco
  15. 重装系统数据恢复工具
  16. 迅雷 11 11.1.3.1122 ,主界面蜕变为简洁清爽的风格
  17. 永久免费的域名注册有吗?免费的域名注册在哪个平台?
  18. linux下通过inode删除文件
  19. Windows10安装apt-cyg教程
  20. 7.14英语学习:英国拍争议文物

热门文章

  1. 天河一号属于微型计算机,勇闯天河 探秘“天河一号”超级计算机
  2. 雷军:钱漫金山 我们终于走出了盐碱地
  3. 网络空间安全数学基础部分证明,筛法、贝祖等式的编程实现。
  4. 基于虚拟化的安全性 - 第1篇:引导过程
  5. 一个用Dijkstra算法实现的路由算法的java程序——2 GraphFromFile类
  6. 数学常数e的含义 (转载)
  7. umeditor 上传图片的配置
  8. JAVA安全基础知识
  9. Solr从安装到使用 for Linux(详细教程)
  10. 2022健康展,中国健康展,亚洲健康展,中国健博会