From 9471acfe0aa602a236a937f019ff02084b500aa5 Mon Sep 17 00:00:00 2001 From: YSTYLE Date: Sun, 23 Jul 2017 01:36:10 +0800 Subject: [PATCH] modify README.md --- README.md | 115 ++++++++++++++++++++++ images/powershell_2017-07-23_00-38-13.png | Bin 0 -> 10537 bytes images/powershell_2017-07-23_01-26-40.png | Bin 0 -> 16808 bytes main.go | 31 +++--- utils/file/file.go | 6 +- 5 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 README.md create mode 100644 images/powershell_2017-07-23_00-38-13.png create mode 100644 images/powershell_2017-07-23_01-26-40.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..07d768e --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# JDK Version Manager (JVMS) for Windows + +Manage multiple installations of JDK on a Windows computer. +[JVMS](https://github.com/ystyle/jvms), [Download Now](https://github.com/ystyle/jvms/releases)! + + +There are situations where the ability to switch between different versions of JDK can be very +useful. For example, if you want to test a project you're developing with the latest +bleeding edge version without uninstalling the stable version of JDK, this utility can help. + +### Installation +- [Download Now](https://github.com/ystyle/jvms/releases) +- decompression zip and copy jvms.exe to a path what you want +- run cmd or powershell as administrator +- cd to folder where `jvms.exe` in +- run `jvms.exe init` +- Setup is complete ! Switch and install jdk see below + +![](images/powershell_2017-07-23_00-38-13.png) + + +### Usage +```shell +NAME: + jvms - JDK Version Manager (JVMS) for Windows + +USAGE: + jvms.exe [global options] command [command options] [arguments...] + +VERSION: + 2.0.0 + +COMMANDS: + init Initialize config file + list, ls List the JDK installations. + install, i Install remote available jdk + switch, s Switch to use the specified version. + remove, rm Remove a specific version. + rls Show a list of versions available for download. + proxy Set a proxy to use for downloads. + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +how to install and switch jdk. see: +- run cmd or powershell as administrator +- jvms rls *list available jdk version for download* +- jvms install 1.8.0_31 *install jdk 1.8.0_31* +- jvms ls *list installed jdk* +- jvms switch 1.8.0_31 *switch jdk version to 1.8.0_31* + +![](images/powershell_2017-07-23_01-26-40.png) +--- + +## What's the big difference? + +First and foremost, this version of jvms has no dependency on other lib. It's written in [Go](http://golang.org/), which is a much more structured +approach than hacking around a limited `.bat` file. It does not rely on having an existing jdk installation. + +The control mechanism is also quite different. There are two general ways to support multiple jdk installations with hot switching capabilities. +The first is to modify the system `PATH` any time you switch versions, or bypass it by using a `.bat` file to mimic the jdk executable and redirect +accordingly. This always seemed a little hackish to me, and there are some quirks as a result of this implementation. + +The second option is to use a symlink. This concept requires putting the symlink in the system `PATH`, then updating its target to +the jdk installation directory you want to use. This is a straightforward approach, and seems to be what people recommend.... until they +realize just how much of a pain symlinks are on Windows. This is why it hasn't happened before. + +In order to create/modify a symlink, you must be running as an admin, and you must get around Windows UAC (that annoying prompt). As a result, JVMS for Windows +maintains a single symlink that is put in the system `PATH` during `jvms init` only. Switching to different versions of JDK is a matter of +switching the symlink target. As a result, this utility does **not** require you to run `jvms use x.x.x` every time you open a console window. +When you _do_ run `jvms use x.x.x`, the active version of jdk is automatically updated across all open console windows. It also persists +between system reboots, so you only need to use jvms when you want to make a change. + +Overall, this project brings together some ideas, a few battle-hardened pieces of other modules, and support for newer versions of JDK. + +I also wrote a simple [data feed](http://github.com/ystyle/jvms) containing a list of jdk versions. It's free for anyone to use. + +### add a local jdk version +e.g: add the 1.7 jdk + +1. copy jdk folder to jvms/store +2. rename folder to `1.7` +3. `jvms list ` check this +4. `jvms switch 1.7` +5. `java -version` check jdk verison + + +## Create own local download server +- create a json file. eg. `index.json` +- add you jdk download link to it. The format is like this: + ```json + [ + { + "version":"1.9.0", + "url":"http://192.168.1.101/files/jdk/1.9.0.zip" + } + ] + ``` +- copy this file to a static file server like nginx, apache etc. +- run `jvms init --originalpath http://192.168.1.101/files/index.json` by the way, `jvms init --java_home` can modify default JAVA_HOME +- the run `jvms rls` or `jvms install x` will list or install your jdk version + +### create a jdk zip file +- open jdk_home folder +- compression all file to `*.zip` file +- copy zip file to your server +- add this zip file link to index.json + + +## License + +MIT. diff --git a/images/powershell_2017-07-23_00-38-13.png b/images/powershell_2017-07-23_00-38-13.png new file mode 100644 index 0000000000000000000000000000000000000000..5014be18491f605ba810d343a6ba93e3a07a590a GIT binary patch literal 10537 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 literal 0 HcmV?d00001 diff --git a/images/powershell_2017-07-23_01-26-40.png b/images/powershell_2017-07-23_01-26-40.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8cdcbaff9930d9325337090cb88193dfbf32ed GIT binary patch literal 16808 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