本示例演示Spring Boot 1.5.9.RELEASE版本的用户手册下载

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.nihaorz</groupId>
<artifactId>spring-boot-doc-download</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies> </project>

Application.java

package com.nihaorz;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset; /**
* @author Nihaorz
*/
public class Application { private static final Charset CHARSET = Charset.forName("UTF-8"); /**
* doc站点地址
*/
private static final String DOC_URL = "https://docs.spring.io/spring-boot/docs/"; /**
* doc起始页
*/
private static final String HTML_URI = "/reference/html/"; /**
* URL分隔符
*/
private static final String URL_SEPARATOR = "/"; /**
* html页面结束标记
*/
private static final String HTML_END_STR = ".html"; public static void main(String[] args) throws IOException {
String storePath = "D:\\IDEA_WS\\OperationCenter_WS\\spring-boot-doc-download\\src\\main\\doc";
String version = "1.5.9.RELEASE";
generateHtmlDoc(storePath, version);
} /**
* 生成文档
*
* @param storePath
* @param version
*/
private static void generateHtmlDoc(String storePath, String version) throws IOException {
String indexPath = DOC_URL + version + HTML_URI;
String html = IOUtils.toString(new URL(indexPath), CHARSET);
saveHtml(storePath, indexPath, html);
Document document = Jsoup.parse(html);
Elements elements = new Elements();
elements.addAll(document.select("span.chapter>a"));
elements.addAll(document.select("span.part>a"));
elements.addAll(document.select("span.appendix>a"));
String urlPath;
System.out.println("共解析得到" + elements.size() + "个子页面");
for (Element element : elements) {
urlPath = element.attr("href");
if (urlPath != null && !"".equals(urlPath.trim())) {
if (!urlPath.startsWith("http")) {
urlPath = indexPath + urlPath;
}
}
html = IOUtils.toString(new URL(urlPath), CHARSET);
saveHtml(storePath, urlPath, html);
}
} private static void saveHtml(String storePath, String urlPath, String html) throws IOException {
if (!urlPath.contains(".html#")) {
if (!urlPath.endsWith(HTML_END_STR)) {
if (urlPath.endsWith(URL_SEPARATOR)) {
urlPath = urlPath + "index" + HTML_END_STR;
} else {
urlPath = urlPath + URL_SEPARATOR + "index" + HTML_END_STR;
}
}
urlPath = urlPath.substring(DOC_URL.length(), urlPath.length());
String localPath = storePath + File.separator + urlPath.replace(URL_SEPARATOR, File.separator);
File file = new File(localPath);
if (!file.exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
FileUtils.write(file, html, CHARSET);
System.out.println("保存" + file.getAbsolutePath() + "成功");
}
} }

运行main函数会在D:\IDEA_WS\OperationCenter_WS\spring-boot-doc-download\src\main\doc\1.5.9.RELEASE\reference\html目录下生成html文件

将以下脚本批量为空字符串

<script>if(window.parent==window){(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create','UA-2728886-23','auto',{'siteSpeedSampleRate':100});ga('send','pageview');}</script>

然后将html文件放到tomcat ROOT应用下访问index.html,使用Fiddler抓包会有如下几个文件404:

highlight.css

manual.css

manual-multipage.css

background.png

important.png

note.png

tip.png

warning.png

email-decode.min.js

他们的真是下载地址如下:

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/css/highlight.css

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/css/manual.css

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/css/manual-multipage.css

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/images/background.png

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/images/important.png

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/images/note.png

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/images/tip.png

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/images/warning.png

https://docs.spring.io/cdn-cgi/scripts/d07b1474/cloudflare-static/email-decode.min.js

将上面的文件下载下来依次放到html下的css、images、js目录下

在上面的html文件中全局搜索email-decode.min.js并替换为相对路径,然后一个新鲜离线版用户手册就诞生了,从tomcat中拿出来邮件浏览器打开即可使用,还不带google统计,跟官方在线版本简直一毛一样啊。

下面放大招

整理好的zip

java代码自动下载Spring Boot用户手册的更多相关文章

  1. Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取

    在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...

  2. 互联网大厂Java面试题集—Spring boot常见面试题(二)

    Spring Boot的核心功能与使用优点? 核心功能: 1)Spring Boot项目为独立运行的spring项目,java -jar xx.jar即可运行. 2)内嵌servlet容器(可以选择内 ...

  3. 互联网大厂Java面试题集—Spring boot面试题(一)

    Spring Boot 需要独立的容器运行吗? 可以不需要,内置了 Tomcat/ Jetty 等容器.通过pom.xml中导入依赖: <!--spring-boot-starter-web:代 ...

  4. Jenkins自动部署spring boot

    Jenkins自动部署spring boot 背景介绍 本公司属于微小型企业,初期业务量不高,所有程序都写在一个maven项目里面,不过是多模块开发. 分了login模块,service模块,cms模 ...

  5. 2018-08-11 中文代码示例之Spring Boot 2.0.3问好

    上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...

  6. Java代码自动部署

    注:本文来源于<it小熊> [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java ...

  7. 开发环境,eclipse编辑器java代码自动提示

    Eclipse+ADT+Android SDK 搭建安卓开发环境 eclipse编辑器java代码自动提示 window-->Preferences-->JAva-->Content ...

  8. VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    源码地址:https://github.com/YANGKANG01/Spring-Boot-Demo 安装扩展 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.spr ...

  9. [转]VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    源码地址:https://github.com/YANGKANG01/Spring-Boot-Demo 安装扩展 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.spr ...

随机推荐

  1. Jlink使用技巧之读取STM32内部的程序

    前言 上一篇Jlink系列文章介绍了如何使用J-Flash来下载Hex或Bin文件到单片机,具体可参考Jlink使用技巧之单独下载HEX文件到单片机,本篇文章介绍,如何使用JFlash来读取单片机的程 ...

  2. FineUIMvc随笔(7)扩展通知对话框(显示多个不重叠)

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 这篇文章我们将改造 FineUIMvc 默认的通知对话框,使得同时显示多个也不会重叠.并提前出一个公共的JS文件,供大家使用. ...

  3. Python爬取豆瓣指定书籍的短评

    Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...

  4. Visual studio 2015 Community 安装过程中遇到问题的终极解决

    早就有给自己电脑升级VS的想法,可是安装过程并不顺利,一直拖到现在,昨天下定决心,把遇到的问题一个个解决,终于安装成功了,将安装过程中遇到的问题和解决方法记录一下. 需要说明一下的是,不同的电脑环境可 ...

  5. React中嵌套组件与被嵌套组件的通信

    前言 在React项目的开发中经常会遇到这样一个场景:嵌套组件与被嵌套组件的通信. 比如Tab组件啊,或者下拉框组件. 场景 这里应用一个最简单的Tab组件来呈现这个场景. import React, ...

  6. MYSQL中SUM (IF())

    今天一个朋友突然给我发过来一个sql语句,一下子问住我了. 我想,这种语法木有见过呀.我就查了查,才明白什么意思,原来是mysql里面的用法. SUM(IF(`hosts`.state = 0, 1, ...

  7. Final Destination II -- 矩阵快速幂模板题

    求f[n]=f[n-1]+f[n-2]+f[n-3] 我们知道 f[n] f[n-1] f[n-2]         f[n-1]  f[n-2]  f[n-3]         1    1    ...

  8. codeforces#1090 D. New Year and the Permutation Concatenation(打表找规律)

    题意:给出一个n,生成n的所有全排列,将他们按顺序前后拼接在一起组成一个新的序列,问有多少个长度为n的连续的子序列和为(n+1)*n/2 题解:由于只有一个输入,第一感觉就是打表找规律,虽然表打出来了 ...

  9. IdentityServer4【Topic】之定义客户端

    Defining Clients 定义客户端 客户端表示哪些可以从你的IdentityServer拿到token的应用. 除了一些可能会变化的细节之外,通常情况下你需要为一个客户端定义如下通用的设置: ...

  10. 解决ssh ltt3.bg.cn 'jps' bash: jps: command not found 问题

    >>提君博客原创  http://www.cnblogs.com/tijun/  << linux 上我用hadoop用户配置好SSH后,运行 ssh ltt3.bg.cn ' ...