首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 11 新特性

Java 11 新特性

作者头像
pollyduan
发布于 2019-11-04 05:26:44
发布于 2019-11-04 05:26:44
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

java 11 是继 java8 之后的第一个LTS版本。因此有必要针对它进行一些深入的学习,虽然短时间内java8 还是主流版本。当然,如果从java8基础上升级,几乎可以确定目标就是java11。

同时也要明确一个问题,现在java的版本升级周期与前些年相比速度快了太多,对于应用开发者来说没必要每一个小版本都去花时间研究,比如这些过渡版本:java9、java10、java12、java13(至少目前还不是LTS版本),了解即可。

下面梳理一下 java11 的新特性。

181: Nest-Based Access Control(基于嵌套的访问控制)

http://openjdk.java.net/jeps/181

规范中提到了一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
We will adjust the JVM's access rules by adding something like the following clause to JVMS 5.4.4:

A field or method R is accessible to a class or interface D if and only if any of the following conditions are true:

  ...
  R is private and is declared in a different class or interface C, and C and D, are nestmates.

For types C and D to be nestmates they must have the same nest host. A type C claims to be a member of the nest hosted by D, if it lists D in its NestHost attribute. The membership is validated if D also lists C in its NestMembers attribute. D is implicitly a member of the nest that it hosts.

A class with no NestHost or NestMembers attribute, implicitly forms a nest with itself as the nest host, and sole nest member.

简单的翻译一下重点部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
当且仅当以下条件为真时,一个成员字段或方法R是可以被类或接口D访问的:

  ...
  R 是私有的,并且是声明在另一个类或接口C中,同时 CD 是嵌套伙伴。

由于CD是嵌套同伴,那么他们一定有同一个嵌套宿主类,在这里是Test。如果C在自己的嵌套宿主的属性中可以列举出D,那么C类就会被D 断言为自己的嵌套成员。如果D也可以在自己的NestMembers 属性中列举出C,那么这个嵌套同伴关系就是有效的。D是自己的隐性嵌套成员。

一个类如果没有 NestHost 或 NestMembers 属性,就会隐性地把自己做为嵌套宿主,以及唯一的嵌套成员。(这和上一句是一致的)

巴拉了一堆,看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.Field;

public class Test {
	public static void main(String[] args) throws Exception {
    System.out.println("---D 的嵌套宿主");
    System.out.println(D.class.getNestHost());
		System.out.println("---D 的嵌套成员");
		for(Class cls:D.class.getNestMembers()) System.out.println(cls);
    System.out.println("---C 的嵌套宿主");
    System.out.println(C.class.getNestHost());
		System.out.println("---C 的嵌套成员");
		for(Class cls:C.class.getNestMembers()) System.out.println(cls);
		System.out.println("---");
	}

	static class C{
	}
	static class D{
	}
}

执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---D 的嵌套宿主
class Test
---D 的嵌套成员
class Test
class Test$D
class Test$C

---C 的嵌套宿主
class Test
---C 的嵌套成员
class Test
class Test$D
class Test$C
---

从该实例中可以看出:

  • C 和 D 是 Test 的嵌套成员类,而Test是 前两者的嵌套宿主,这是显而易见的。
  • C 可以在其NestHost(即Test)中列举出D成员,因此他会被加入到D的嵌套成员列表中。
  • D 也同上。

继续来研究这个话题,java 11 解决了什么问题?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.Field;

public class Test {
	public static void main(String[] args) throws Exception {
    D d=new D();
    d.R();
	}

	static class C{
		private int flag=0;
	}
	static class D{
		public void R() throws Exception {
      C c=new C();
      c.flag=1;
      System.out.println(c.flag);// ① 这里没有问题

      Field f = C.class.getDeclaredField("flag");
      f.setInt(c, 2);
      System.out.println(c.flag);//② jdk8 抛出 IllegalAccessException,jdk11 正常
		}
	}
}

在java8中,注释① 处的代码是没有问题的,因为嵌套类是可以访问别的嵌套类的私有属性的。

但注释② 处的代码会抛出异常,这是一个令人看困惑的问题。java11 修复了这个问题,以上代码在java11中执行正常。

309: Dynamic Class-File Constants(动态类文件常量)

http://openjdk.java.net/jeps/309

这是针对类加载机制的修改,增加了一个名为 CONSTANT_Dynamic 的常量池实体。CONSTANT_Dynamic常量池条目对bootstrap方法进行编码,以执行解析(一个方法句柄)、常量的类型(一个类)和任何静态bootstrap参数(常量的任意序列,在动态常量之间的常量池中排除周期)。

该方案是为了降低创建新形式类文件常量的代价和干扰,为语言设计者和编译器开发者提供更广泛的表现形式以及性能。

315: Improve Aarch64 Intrinsics(改进 Aarch64 内联函数 )

http://openjdk.java.net/jeps/315

AArch64是ARMv8 架构的一种执行状态。

在AArch64 CPU指令集中,改进了存在的string和array的内联函数,包括:String::compareTo, String::indexOf, StringCoding::hasNegatives, Arrays::equals, StringUTF16::compress, StringLatin1::inflate 以及多样的 checksum 计算方法。

实现了 java.lang.Mathsin, cos 以及 log() 等函数。

318: Epsilon: A No-Op Garbage Collector(Epsilon — 一个无操作的垃圾收集器)

http://openjdk.java.net/jeps/318

开发了一个GC,它处理内存分配,但不实现任何实际的内存回收机制。一旦可用的Java堆耗尽,JVM就会关闭。

Epsilon GC 通过 -XX:+UseEpsilonGC 开关启用。

320: Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA 模块)

http://openjdk.java.net/jeps/320

从Java SE平台和jdk中移除了 Java EECORBA 模块,他们在java9中已经标记为 @Deprecated 了。

模块包括:JAX-WS、JAXB、JAF 和 Common Annotation.

具体的技术组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.xml.ws (JAX-WS, plus the related technologies SAAJ and Web Services Metadata)
java.xml.bind (JAXB)
java.activation (JAF)
java.xml.ws.annotation (Common Annotations)
java.corba (CORBA)
java.transaction (JTA)

相关的包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.se.ee (Aggregator module for the six modules above)
jdk.xml.ws (Tools for JAX-WS)
jdk.xml.bind (Tools for JAXB)

共计九个jmods:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Their source code will be deleted from the OpenJDK repository.
Their classes will not exist in the JDK runtime image.
Their tools will no longer be available:
wsgen and wsimport (from jdk.xml.ws)
schemagen and xjc (from jdk.xml.bind)
idlj, orbd, servertool, and tnamesrv (from java.corba)
The JNDI CosNaming provider (from java.corba) will no longer be available.
No command line flag will be capable of enabling them, as --add-modules does on JDK 9.

321: HTTP Client (Standard)

http://openjdk.java.net/jeps/321

HTTPClient 是在java9引入孵化的项目,在java10中通过JEP110进行了更新,最终在java11通过JEP321 形成标准。

API通过 CompletableFutures 实现了非阻塞的request和response功能。

背压和流控制是在 java.util.concurrent.Flow API中通过 reactive-streams 平台实现的。

JEP 321 几乎完全重写了以前的孵化API,实现了完全的异步(以前的HTTP/1.1的实现是阻塞的)。

模块名和包名是: java.net.http

同步请求用例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
import java.nio.file.Path;
import java.nio.file.Paths;

public class HttpSyncDemo{
    public static void main(String[] args) throws Exception {
       HttpClient httpClient = HttpClient.newHttpClient();
       HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://www.baidu.com"))
            .timeout(Duration.ofSeconds(20))
            .header("Content-Type", "text/html")
            .build();
       HttpResponse<Path> response =
            httpClient.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get("baidu.txt")));
       System.out.println("Response status code: " + response.statusCode());
       System.out.println("Response headers: " + response.headers());
       System.out.println("Response body: " + response.body());
    }
}
异步请求用例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.util.concurrent.CompletableFuture;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;
import java.nio.file.Path;
import java.nio.file.Paths;

public class HttpAsyncDemo{
    public static void main(String[] args) throws Exception {
       HttpClient httpClient = HttpClient.newHttpClient();
       HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://www.baidu.com"))
            .timeout(Duration.ofSeconds(20))
            .header("Content-Type", "text/html")
            .build();
       CompletableFuture<String> response =
            httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body);
       response.whenComplete((resp, t) -> {
            if (t != null) {
                System.out.println("response message:" + t.getMessage());
            } else {
                System.out.println("response:" + resp);
            }
        }).join();
    }
}

323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数的局部变量语法)

在java10 中已经引入了本地变量的类型推断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var greeting="helloworld!";
System.out.println(greeting);

在java11中类型推断得到了增强,开发者可以使用 var 声明 lambda 参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Inference von Lambda-Parametern
Consumer<String> printer = (var s) -> System.out.println(s); // statt s -> System.out.println(s);

324: Key Agreement with Curve25519 and Curve448(Curve25519 和 Curve448 算法的密钥协议)

http://openjdk.java.net/jeps/324

密钥交换协议规范 RFC 7748 定义了比 elliptic curve Diffie-Hellman (ECDH) 更高效、更安全的密钥协议模式,JEP324是该协议的具体实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KeyPairGenerator kpg = KeyPairGenerator.getInstance("XDH");
NamedParameterSpec paramSpec = new NamedParameterSpec("X25519");
kpg.initialize(paramSpec); // equivalent to kpg.initialize(255)
// alternatively: kpg = KeyPairGenerator.getInstance("X25519")
KeyPair kp = kpg.generateKeyPair();

KeyFactory kf = KeyFactory.getInstance("XDH");
BigInteger u = ...
XECPublicKeySpec pubSpec = new XECPublicKeySpec(paramSpec, u);
PublicKey pubKey = kf.generatePublic(pubSpec);

KeyAgreement ka = KeyAgreement.getInstance("XDH");
ka.init(kp.getPrivate());
ka.doPhase(pubKey, true);
byte[] secret = ka.generateSecret();

什么是密码交换协议?为了数据交互的安全,当客户端和服务端进行交互前,二者需要和对方约定一个密码用来加密解密,那么这个交换密钥(握手)的过程中如何保证密钥不被拦截?这就是密码交换协议解决的范畴。

327: Unicode 10

http://openjdk.java.net/jeps/327

升级平台API,以支持 unicode规范 的 10.0 版本。

设计的类有:java.lang.Characterjava.lang.Stringjava.awt.font.NumericShaperjava.text.Bidijava.text.BreakIterator 以及 java.text.Normalizer

该实现增加了 16,018 个字符,和10个新的脚本。

328: Flight Recorder (飞行记录器)

http://openjdk.java.net/jeps/328

为java应用程序和 HotSpot JVM 提供了一个低开销的排错框架。

发送事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jdk.jfr.*;

public class Hello{
@Label("Hello World")
@Description("Helps the programmer getting started")
static class HelloWorld extends Event {
   @Label("Message")
   String message;
}

public static void main(String... args) throws Exception {
    HelloWorld event = new HelloWorld();
    event.message = "hello, world!";
    event.commit();
    Thread.sleep(30*60*1000);
}
}

执行如下命令在启动应用程序时记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ java -XX:StartFlightRecording Hello
Started recording 1. No limit specified, using maxsize=250MB as default.

Use jcmd 6120 JFR.dump name=1 filename=FILEPATH to copy recording data to file.

编码方式订阅事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.nio.file.*;
import jdk.jfr.consumer.*;

public class Consumer{
  public static void main(String... args) throws Exception{
    Path p = Paths.get("recording.jfr");
    for (RecordedEvent e : RecordingFile.readAllEvents(p)) {
      try{
        System.out.println(e.getStartTime() + " : " + e.getValue("message"));
      }catch(Exception ee){
      //ee.printStackTrace();
      }
    }
  }
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-10-18T08:20:37.755218322Z : hello, world!

根据提示执行jcmd 完成记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jcmd <pid> JFR.start
$ jcmd <pid> JFR.dump filename=recording.jfr
$ jcmd <pid> JFR.stop

329: ChaCha20 and Poly1305 Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)

http://openjdk.java.net/jeps/329

实现了 RFC 7539 规范中的 ChaCha20 和 ChaCha20-Poly1305 两种加密算法。

ChaCha20 是新式的流加密算法,可以代替陈旧的,不太安全的 RC4 流加密算法。

ChaCha20 测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Get a Cipher instance and set up the parameters
// Assume SecretKey "key", 12-byte nonce "nonceBytes" and plaintext "pText"
// are coming from outside this code snippet
Cipher mambo = Cipher.getInstance("ChaCha20");
ChaCha20ParameterSpec mamboSpec
    = new ChaCha20ParameterSpec(nonceBytes, 7);   // Use a starting counter value of "7"
// Encrypt our input
mambo.init(Cipher.ENCRYPT_MODE, key, mamboSpec);
byte[] encryptedResult = mambo.doFinal(pText);

ChaCha20-Poly1305 测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Get a Cipher instance and set up the parameters
// Assume SecretKey "key", 12-byte nonce "nonceBytes" and plaintext "pText"
// are coming from outside this code snippet
Cipher mambo = Cipher.getInstance("ChaCha20-Poly1305");
AlgorithmParameterSpec mamboSpec = new IvParameterSpec(nonceBytes);

// Encrypt our input
mambo.init(Cipher.ENCRYPT_MODE, key, mamboSpec);
byte[] encryptedResult = new byte[mambo.getOutputSize(pText.length)];
mambo.doFinal(pText, 0, pText.length, encryptedResult);

330: Launch Single-File Source-Code Programs(启动单一文件的源代码程序)

可以启动尚未编译的类文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java HelloWorld.java

它相当于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
javac -d <memory> HelloWorld.java
java -cp <memory> HelloWorld

同时,java11也引入了 Shebang(#!)机制可以直接编写java可执行脚本,如:以下是 demo.sh 的脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/local/jdk/bin/java --source 11

public class HelloWorld{
  public static void main(String[] args){
    System.out.println("helloworld");
  }
}

执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# chmod +x demo.sh
# ./demo.sh
helloworld
  • 如果你对shell编程比较熟悉,你可能希望使用env来避免使用java路径的硬编码,但这是错误的。

env的语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env 脚本解释器名称

如果编写如下脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env java --source 11

执行会出现错误,因为 java --source 11 被当做了一个整体传递给了 env.

331: Low-Overhead Heap Profiling(低开销的 Heap Profiling)

http://openjdk.java.net/jeps/331

提供了一个低开销的堆分配采样方法,可以使用JVMTI 进行访问。

332: Transport Layer Security (TLS) 1.3(支持 TLS 1.3)

http://openjdk.java.net/jeps/332

了解 https的开发者都应该知道TLS,这是 TLS1.3 的实现。

333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) (可伸缩低延迟垃圾收集器)

http://openjdk.java.net/jeps/333

一个新的低延迟的垃圾回收期,该版本提供的是实验性特性。

335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)

http://openjdk.java.net/jeps/335

将 Nashorn javascript 引擎标记为废弃,以后的版本会被删除。世事难料,它是java8才被引入的,这就废弃了,至于原因,规范中说:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
With the rapid pace at which ECMAScript language constructs, along with APIs, are adapted and modified, we have found Nashorn challenging to maintain.

大致意思是:随着ECMAScript语言结构和api的快速调整和修改,我们发现很难维护Nashorn。

当版本帝遇到版本帝,一山不容二帝,byebye.

336: Deprecate the Pack200 Tools and API (弃用 Pack200 工具和 API)

http://openjdk.java.net/jeps/336

将pack200 和 unpack200 工具标记为弃用,同时弃用的还有 java.util.jar 中的API。

pack200 是什么?它在java的生命中很重要。pack200 是jar文件的压缩模式,它当初的目标是"在java应用程序打包、传输、交付过程中减少磁盘存储和带宽需求"。

这么重要的工具为什么要废弃,官方给出了三个原因:

  • 过去,由于网络使用mordem拨号的56k 带宽阻碍了java的接受程度。随着java功能的增强,下载数据的大小疯狂增长进一步阻碍了java的接受程度。使用Pack200压缩jdk可以很好的解决这个问题。然而随着技术的发展网速大幅度提升,同时java9提供了jmod工具用以为jre瘦身。java8是最后一个用Pack200打包的正式版本,之后,我们不再需要它了。
  • 除了JDK之外,使用Pack200压缩客户端应用程序(尤其是applet)也很有吸引力。然而随着客户端浏览器UI设计的改变,大部分浏览器不在接受java插件。因此 Pack200的一个主要使用者——applet也不会再帮助它稳固地位。
  • Pack200 是一个复杂的技术,紧紧地与 class文件格式及jar 文件格式相关联。随着JEP 200(模块化jdk)的采用,二者已经发生了不可预料的变化。这个实现将java代码和本地C代码拆分开来,这使它更难维护。Pack200 不利于java se 的模块化。综上所述,维护pack200的成本是巨大的,超过了把它包含在java se和jdk中所带来的好处。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Jekyll搭建博客并部署到GitHub
尝试过很多Windows搭建静态网页博客的方法,都是失败告终。试了几次Jekyll,这一次终于成功了。想把一些坑路分享一下。
繁华是客
2023/03/03
1.3K0
Jekyll + Github Pages 搭建个人免费博客
今天亲手通过 Jekyll 搭建了一套免费博客,搭建步骤其实超级简单。你不需要购买域名,也不需要购买服务器,就可以轻松拥有你自己的博客。
不安分的猿人
2020/03/02
2.4K0
高速部署博客网站,Jekyll满足你的需求!
云开发(CloudBase)是一款云端一体化的产品方案 ,采用 serverless 架构,免环境搭建等运维事务 ,支持一云多端,助力快速构建小程序、Web应用、移动应用。
腾讯云开发TCB
2020/06/03
1.1K0
2020年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路
万万没想到!Github 竟然受到攻击了!还能让我使用了 GitPage 的博客瘫痪了!
小傅哥
2020/03/28
1.4K0
2020年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路
如何在Ubuntu 16.04上建立一个Jekyll开发网站
Jekyll是一个静态站点生成器,它有内容管理系统(CMS)的一些优点,同时避免了此类数据库驱动的站点引入的性能和安全问题。它具有“博客意识”,并包含处理日期组织内容的特殊功能,但其用途不仅限于博客网站。Jekyll非常适合需要离线工作的人,更喜欢使用轻量级编辑器进行内容维护的Web表单,并希望使用版本控制来跟踪其网站的更改。
小皇帝James
2018/10/22
2K0
基于Jekyll与Github Pages搭建博客
有搭建博客这个想法的原因是看到室友搭的博客,感觉很不错,暑假了也得搞点事情,于是就参考了室友的博客,查了不少教程学着自己也搭一个。
ttony0
2022/12/26
1.5K0
基于Jekyll与Github Pages搭建博客
Ruby x Jekyll 本地调试环境搭建
这里是本站开源: https://github.com/szhshp/NextJS-BlogTemplate-ProjectTitan
szhshp
2022/09/21
2K0
在 Linux 上搭建Jekyll静态博客
在CentOS,Ubuntu 按照同样步骤安装,Ruby Gems 往往都无法搭建成,每次都是依赖不对,各种奇葩原因,解决办法就是使用 RVM 安装,解决 Ruby 的环境依赖管理,而且每次安装Jekyll基本不会出错 本文主要介绍如何用一条靠谱的路子快速安装 Ruby 环境 搭建Jekyll博客。 一、Jekyll介绍 jekyll是一个简单的免费的Blog生成工具,类似WordPress。但是和WordPress又有很大的不同,原因是Jekyll只是一个生成静态网页的工具,不需要数据库支持。但是可以配合
程序员鹏磊
2018/02/09
2.9K0
在 Linux 上搭建Jekyll静态博客
听说你想要部署 Octopress?满足你
Octopress 是一个面向开发者的博客系统,广受程序员的喜爱。既然大家有需求,那么 Octopress 也要安排上~
腾讯云开发TCB
2020/06/03
1.2K0
玩转Github:使用GitHub Pages打造你的专属技术博客
那就有同学问了:作为一个后端开发者,前端的内容比较薄弱,怎样做的又好看,又方便呢?还有,习惯本地软件写文章,最好能不花钱卖服务器……
花花Binki
2023/11/16
6810
玩转Github:使用GitHub Pages打造你的专属技术博客
在Windows上安装Jekyll
在Windows上安装Jekyll Jekyll介绍 jekyll是一个简单的免费的Blog生成工具,类似WordPress。但是和WordPress又有很大的不同,原因是jekyll只是一个生成静态网页的工具,不需要数据库支持。但是可以配合第三方服务,例如Disqus。最关键的是jekyll可以免费部署在Github上,而且可以绑定自己的域名。 Jekyll团队没有正式支持在Windows上使用Jekyll,官方不建议在Windows上使用Jekyll。 安装 Ruby 首先,点击下面的按钮,下载与
程序员鹏磊
2018/02/09
2K0
在Windows上安装Jekyll
使用Jekyll显示Jupyter笔记本
Jekyll是一个用Ruby编写的静态站点生成器,支持博客并与Github页面整合。因为Github只负责托管,这种设置使数据分析共享和可视化变得简单。Jekyll提供了各种主题和插件,因此用户无需担心Web开发。
eru
2018/09/13
4.4K0
使用Jekyll显示Jupyter笔记本
在本地运行 fyne 官网
要深入学习和理解一个框架,官方文档是必须要仔细阅读的。fyne 官网有非常系统和详尽的文档。官方网站:https://fyne.io/。有时候我们会有这样一个需求——离线查看文档。我经常乘坐高铁来往杭州、上海两地,地铁、高铁上通常网络比较差,甚至没有网络。为此我特地去研究了一番怎样搭建 fyne 离线文档。
用户7731323
2020/09/08
7.5K0
【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决
今天在博客专家群看到CSDN韩俊强发表了一篇用Jekyll搭建个人博客的文章,感觉很好。 搭建博客方便很多,开始一直想着自己搭建博客,然后一直没什么时间,在做另外一个项目,所以现在就考虑用Jekyll在GITHUB上搭建博客了。
谙忆
2021/01/21
7630
【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决
如何为自己创建一个既时尚又好用的博客网站
拥有一个自己的博客网站是每一位有追求的写作爱好者的梦想。本文将向大家分享:如何为自己创建一个既时尚又好用的博客网站。 下面是用于本文演示的一个博客网站的效果图,大家也可以访问https://crazy
CrazyCodeBoy
2018/05/07
2.3K0
如何为自己创建一个既时尚又好用的博客网站
踩坑记录丨记Jekyll + Github Pages搭建个人博客时遇到的各种问题
其实这个想法自己很久之前就有了,04-08那天16:34的那篇文章算是导火索,因为最近一直再用Obsidian,然后找一些有关文档,发现了这一篇博客。之后就进入了这个人的主页,发现挺不错的,用的github搭建的网站,随即燃起了搭建个人博客的导火线。
AXYZdong
2022/05/05
1.3K0
踩坑记录丨记Jekyll + Github Pages搭建个人博客时遇到的各种问题
下载 Jekyll,并使用它在本地搭建一个博客
0 前言 之前搭建的博客是在线的,没有在本地搭建一个进行预览,导致修改样式或者添加功能的时候要频繁的 push ,然后再去查看改得好不好看,这样的体验可以说是非常糟糕。 所以我下载了 Jekyll 到本地,然后生成本地的博客进行预览,觉得改得还行才 push,这样就比较省事了。 Jekyll 可以将纯文本转换为静态博客网站,简单好用,不需要自己开发大部分功能,甚至直接找模板修改一下就能够使用。 关心博客内容就足够了,别的就直接使用模板吧。 1 安装 1.1 下载和安装 Ruby 进入网站进行下载 htt
伪君子
2018/07/12
1.2K0
Hello Octopress
2016-11-13 update: 后来我的博客先后从Octopress进化到Hexo以及现在的Hugo
宅男潇涧
2018/08/01
7890
如何快速给自己构建一个温馨的"家"——用Jekyll搭建静态博客
我相信,每个程序员都有一个愿望,都想有一个属于自己的"家"——属于自己的博客,专属的网站。在自己的“家”中,可以和志同道合的兄弟一起分享和讨论任何技术,谈天说地。更重要的是可以当做自己的技术积累,提升自己实力。那么接下来就来说说我博客搭建过程。
一缕殇流化隐半边冰霜
2018/08/30
1.6K0
如何快速给自己构建一个温馨的"家"——用Jekyll搭建静态博客
Windows下jekyll的安装和使用
下载地址:https://rubyinstaller.org/downloads/
foochane
2019/05/23
1K0
相关推荐
Jekyll搭建博客并部署到GitHub
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 181: Nest-Based Access Control(基于嵌套的访问控制)
  • 309: Dynamic Class-File Constants(动态类文件常量)
  • 315: Improve Aarch64 Intrinsics(改进 Aarch64 内联函数 )
  • 318: Epsilon: A No-Op Garbage Collector(Epsilon — 一个无操作的垃圾收集器)
  • 320: Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA 模块)
  • 321: HTTP Client (Standard)
    • 同步请求用例
    • 异步请求用例
  • 323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数的局部变量语法)
  • 324: Key Agreement with Curve25519 and Curve448(Curve25519 和 Curve448 算法的密钥协议)
  • 327: Unicode 10
  • 328: Flight Recorder (飞行记录器)
  • 329: ChaCha20 and Poly1305 Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)
  • 330: Launch Single-File Source-Code Programs(启动单一文件的源代码程序)
  • 331: Low-Overhead Heap Profiling(低开销的 Heap Profiling)
  • 332: Transport Layer Security (TLS) 1.3(支持 TLS 1.3)
  • 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) (可伸缩低延迟垃圾收集器)
  • 335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)
  • 336: Deprecate the Pack200 Tools and API (弃用 Pack200 工具和 API)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档