|
年底了,灌点水
有感于知乎经常妖魔化Java,经常可以看到知乎上会有些诸如Java一定要安装才能用啊,Java一定要按照Spring的方式去写才能用啊,所以Java就是那么繁琐blablabla
其实这些言论非常可笑,当然如果我们只是blablabla的话,那这个是缺乏说服力的
在mcgill的时候,上过一门communication in engineering的课,老师就问,如何说服别人?
有两个东西是别人很难否认的
facts & statistics
后者相对容易操控,或者说有一定的操控的空间,但是前者,事实你怎么否认?
所以我们讨论技术问题的时候,尽量让读者用户能够验证
你可以不相信我说的,你自己试试,看我说的对不对,如果你试出来,跟我说的不一样
那大可以说你是错的,但是如果你试出来,诶,好像是这么一肥四哦,那就相信你自己的眼睛
我们来说一下Java有多可爱,有多简单,在我们手里,可以是如此简单和傻瓜,很多命令你猜都能猜出来在哪里
1)不安装Java,JDK这些,能否运行Java代码?
当然可以啦,现在你百度出来的各种Java教程,学习Java第一步,classpath,path之类的,是吧?贼78烦,什么意思嘛?网络各种抄袭文章又解释不清楚,很多人因此被劝退,那我们不解释这些东西,我们用最笨的方法,下载压缩包,解压缩后用命令行来启动java,不安装,安装个p,用个软件干嘛要安装?流氓软件才安装
先去openjdk官网上下载build,注意,在11之前,OpenJDK不提供build好的压缩包下载,你要自己去下源码,然后build,只有OracleJDK提供安装包下载,安装包的好处是傻瓜化处理,双击就可以install了,但是坏处就是,你不知道它在里面搞了什么飞机,或者说你去琢磨这里面的道道,相对不太方便,像latte大鸟这种,一般都是自己build,但终究这种方式不够傻瓜
那肿么办呢?感谢openjdk,感谢开源社区,11之后,提供了build下载
三个平台的压缩包都有了,自己选自己的操作系统对应的版本下载
下载后解压缩,进去看看有啥东西,不同操作系统不一样,但是一路进去,你应该最后能找到一个包含有bin, jmods等文件夹的文件夹
对我们来说,比较重要的文件夹就是bin文件夹,这里面有着jdk所有的命令,java,javac,jlink这些工具都在这里了,记住这个包含有bin,jmods,lib等文件夹的文件夹的路径
然后打开终端,win下cmd,mac下terminal,进到这个文件夹下,运行
bin/java -version win下就是
bin\java -version 吐槽一下微软的反斜杆真是蛋疼
然后就能看到熟悉的版本信息啦,比如这种:
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode) 是不是超级简单?然后你猜都能猜出来很多东西
比如java程序经常很蛋疼的各种path,缺省应该在哪里呀?就是你运行命令的这个当前路径
然后javac也在bin目录下,你找到javac就能编译你的.java文件啦
比如我新建了一个com文件夹,然后在com文件夹下新建一个whitewoodcity文件夹,在whitewoodcity文件夹下,新建了一个Main.java,然后写入Java的hello world程序:
package com.whitewoodcity;
public class Main{
public static void main(String[] args){
System.out.println("hello world");
}
}记录保存,退出来,退到bin和com文件夹的同级文件夹下
然后执行
bin/javac com/whitewoodcity/Main.java 编译成功,然后
bin/java com.whitewoodcity.Main 就可以看到可爱的hello world啦
是不是超级简单啊?
其实这个逻辑在linux,unix,乃至大部分开源软件,都是差不多的逻辑,java也不例外
这个星球上目前只有微软那一套是特殊的语法,比如反斜杆,所以如果是在windows下,把上面的斜杆改成反斜杆就是了,其他逻辑同理,IDE等图形工具,本质上也是去找这些命令行,一个道理,还有各种基于java的开源软件,最后也都是这个入口,只不过有些时候,一些傻瓜化的工具,会做一些脚本包装而已,比如tomcat,这样的java,是不是跟一般的脚本没啥区别?比node可能还要简单一点
如果你想执行jar包的话,jar包其实就是zip包,没有区别,在java命令后面加参数就是了,比如我有一个hello.jar,里面有做好的main class,要肿么执行呢?
加上-jar参数
bin/java -jar hello.jar 搞定,是不是超级简单啊?那打这种可执行的jar包,eclipse还有maven插件,都有现成的工具可以做,如果我们不想了解jar格式细节的话,maven上还可以做fat jar,把所有的依赖全部拆开,最后打成一个胖胖的jar包,然后直接执行就可以了,四不四很简单?
2)classpath,如果我有依赖该怎么加上去?
如果我们有依赖,比如我们自己写了一个程序,依赖了b.jar,那该肿么办呢?
简单,加参数,-cp,然后再在后面加上路径和依赖即可
比如
bin/java -cp "." -jar hello.jar cp表示classpath
如果我有某个路径下的jar包依赖呢?
比如a文件夹下b.jar,我需要依赖这个jar包呢?
简单,加上分隔符,unix-like系统是:,win下是;,再次吐槽一下微软的设计
比如
bin/java -cp ".:a/b.jar" -jar hello.jar 是不是很简单呢?
win下
bin\java -cp ".;a\b.jar" -jar hello.jar 嗯,知道了这一点之后,你还可以把java命令换个名字,比如你改成strike
你把bin/java改成bin/strike,win下就是bin\java.exe改成bin\strike.exe
然后运行下试试
3)jlink等工具
jigsaw之后,我们可以定制runtime了,我们下载下来的runtime,是缺省runtime,里面有很多东西,但是jdk提供了一种方式,让我们能够根据自身需要,扩展以及删除不需要的模块,这个模块就是jmods,所以你在bin,lib那个同级文件夹下,可以找到一个jmods文件夹,里面就是能够让你定制runtime的模块了
其他项目会提供扩展jmods下载,比如我们很常用的javafx,不止一次在知乎上有人问,11之后,怎么运行javafx,以前文章解释过,那这里再解释一遍
前面说到,bin文件夹下,有java等工具,那除了java,javac这些常规工具以外,我们还有一些jdk的工具,其中就包括有jlink
那么我们可以用jlink来定制我们需要的runtime,这对于用javafx做gui等定制化项目是必需的,顺便说一下,我最近都在写javafx,那个效率刚刚的,被javafx圈粉了,设计得太好了,写起来手感比flutter更好一点,flutter已经很好了,javafx更好,扯远
那肿么做jlink呢?比如我写了一个javafx的hello world,是吧
代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}代码我从gayhuba上抄来的
那你要编译这个东西,最好用maven那些,那这个看tutorial
但是你要执行的话,你需要定制自己的runtime,用jlink
先下载jmods从javafx提供的链接去下载,下载后解压缩,里面就是一堆.jmod文件
然后把这一堆jmod文件拷贝到刚刚解压缩的jdk文件夹(就是包含有jdk的bin,lib那个文件夹)下的jmods文件夹下,把这些jmods放在一起
然后退出来,到bin那个目录下,执行jlink命令,比如我们要做一个mac下的runtime,起名叫做macrt,那么命令就是
bin/jlink --module-path jmods --add-modules java.base,javafx.graphics,javafx.controls,java.logging --output macrt --也是参数的意思,-和--的区别就是,前者表示缩写,比如-cp就表示--classpath,--则是单词的完整拼写,所以你看这里--module-path,--add-modules,--output,猜都能猜出来是啥意思,执行后,就可以看到同级文件夹下多了一个macrt的文件夹
这就是我们需要的runtime了,进去之后,发现里面也有bin,lib等文件夹,那我们要执行这个文件夹下的命令,一样的,也是
macrt/bin/java HelloFX 同理,win下就是
bin\jlink --module-path jmods --add-modules java.base,javafx.graphics,javafx.controls,java.logging --output winrt 和
winrt\bin\java HelloFX 我手头没有win电脑,所以一些命令可能有错,读者自己试试就知道了
所以你看java多简单?哪里需要整什么框架,搞一大堆配置文件才能写,那还了得
另外bin文件夹下还有很多很有趣的工具,比如jshell之类的,建议有兴趣的可以多尝试,多玩玩,看看java版的repl有什么特殊的,其实也没啥特殊的,所有语言的repl,shell都大同小异
openjdk真是太好玩了,爱不释手,比佛拉特还好玩
bye |
|