好吧,真正的谈话:我像这样完成了我的第一个Java项目,完全专业的开发人员,而没有任何有关Java构建/工具生态系统的线索。 我在IntelliJ中按下了足以运行的按钮,(幸运的是)它们得以运行,并且我在IntelliJ的温柔拥护下永久地花了整个项目的其余时间。
即兴发挥? 不,我叫它风格下降。
基本上,我发现理解Java工具非常困惑。 因此,在开始我的第二个Java项目之前,我想对到底发生了什么更好地理解。
在撰写几篇文章的过程中,我们将学习一些有关如何在本地机器上安装Java的更多信息,然后再构建一个简单的(人为设计的)你好,世界应用程序,利用外部库和多个文件,因此我们可以对标准Java目录结构以及如何从命令行构建应用程序有所了解。 然后,我们将在流行的构建工具Gradle的帮助下继续集成同一应用程序,最后将项目集成到IntelliJ IDE中。 在本系列的最后,我们所有人都应该对所有工具的幕后知识有一个更轻松的了解,并有更多的信心来修补我们的项目。
First steps: the absolute basics. Time for a forensic journey. The first time I quickly fudged my way through installing OpenJDK 12 and I can't even tell you how I did it. Downloading OpenJDK, as far as I can tell, gives you a directory of unloved binaries which virtually zero guidance on what you're supposed to do with them. I felt like Ted Danson Steve Guttenberg in Three Men and a Baby.
** tl; dr:*复制未压缩的OpenJDK目录-例如jdk-12.jdk-成/图书馆/ Java / JavaVirtualMachines /你会好起来的。*
但是,为什么呢? 让我们解开它。
警告:这仅适用于macOS。 Linux和Windows不可避免地会有所不同,并可能拥有大量自己的gremlins。
Where is Java actually installed?
继续学习吧,因为通过Java的安装而下降就像盯着Cthulhu呆了两个星期。 进入它的黑暗之心可以保证你最终会成为库尔兹。 您已被警告。
让我们从顶部开始:
$ java --version
openjdk 12 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode, sharing)
And then we can peek inside our java.home
system property from within jshell
.
jshell> System.getProperty("java.home")
$1 ==> "/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home"
好吧,酷。 我们已经安装了Java。 它是最新版本,而且很高兴不是Oracle JDK。 事情看起来很乐观。 所以大概我们的外壳会指向我们的java.home目录?
$ which java
/usr/bin/java
好。 但是,该文件为74字节,如果您问我一个故事标志,它是一个符号链接。 这不是我们的第一个牛仔竞技表演!
$ greadlink -f $(which java)
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
好吧,这是新的。 如果我们内窥视JavaVM.framework目录中,我们可以看到我们所有熟悉的Java文件。
$ ls -lh /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/ | grep "java"
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 java
-rwxr-xr-x 1 root wheel 74K 21 Mar 06:07 java_home
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 javac
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 javadoc
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 javah
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 javap
-rwxr-xr-x 1 root wheel 57K 21 Mar 06:07 javapackager
-rwxr-xr-x 1 root wheel 56K 21 Mar 06:07 javaws
These aren't symbolic links, so that's good. Things still don't seem to be lining up, mind. But a little more digging on Stack Overflow suggests these are stub applications which determine the version of the JVM to use. Have you ever seen anything like that before? Because I haven't.
更多互联网拖网显示java_home,根据其人页:
返回适合于设置JAVA_HOME环境变量的路径。 它根据Java Preferences应用程序中用户启用的和首选的JVM确定此路径。 可以提供其他约束来过滤可用的JVM列表。 默认情况下,如果没有约束与可用的JVM列表匹配,则使用默认顺序。 路径将打印到标准输出。
只有我完全可以肯定,Apple早就删除了Java Preferences应用程序,但是没关系。 他们是否只是从操作系统中删除了对Java的一半支持,从而使我们轻而易举地束缚在机器中一个不受人喜爱且无法维护的幽灵上? 这是一个开放的问题:我不知道。 我只知道如果我们关心这样的一致性,我们就不会成为Java开发人员。 让我们启动它。
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
好的! 太棒了 我们终于到了/图书馆/ Java / JavaVirtualMachines。 我只失去了一部分理智,所以我将以此为赢。爪哇_home默认情况下,似乎优先使用最新版本的JDK,因此,如果安装了12,它将在运行时取代11。爪哇,爪哇c,壳等等。 您可以使用以下命令查看所有当前安装的版本-V(大写)标志。
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
12, x86_64: "OpenJDK 12" /Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
11, x86_64: "OpenJDK 11" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
同时,-v(小写)标志将返回到所述JVM的路径,然后可以将其设置为JAVA_HOME环境变量。JAVA_HOME设置时,优先于默认顺序/ usr / libexec / java_home。
$ export JAVA_HOME=$(/usr/libexec/java_home -v 11)
$ java --version
openjdk 11 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
想重温JDK 1.6的太平日子吗? 快走吧 尽情狂欢。 不,我很好-我会在这里坚持,干杯。 当然,运行出口shell中的命令只会持续该shell实例的生命周期。 要获得更永久的解决方案,您需要掌握一下.bashrc/.zshrc或同等学历。
我假设默认的选择/ usr / libexec / java_home镜像当您在其中运行存根应用程序之一时会发生什么/System/Library/Frameworks/JavaVM.framework/。 或者,您可能已经发现还有一个java_home中的二进制JavaVM.framework目录之前。 等一下...
$ greadlink -f /usr/libexec/java_home
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home
你看我做了警告您那会很乱。 但是至少现在我们对Java如何在我们的系统上运行有了更多的了解!
在下一篇文章中,我们将开始研究编译和运行我们的第一个Java应用程序所面临的挑战。 实时发布时,我将通过链接更新此帖子!
这个帖子对您有用吗? 对于是否有任何可以说得更清楚或更能说明问题的评论和反馈,我深表感谢。 我也非常感谢任何更正!