[原创]自定义参数静默方式安装JDK1.8

摘要:当Java桌面程序开发完成做产品的时候,需要假想拿到产品的客户是一个电脑盲,让程序傻瓜化安装以便减少分发出去的产品带来

的未知工作量(安装答疑,操作系统问题引起安装失败等),当然你也可以把安装过程中出现的问题写入文档手册。本文写作的背景是

1.不想让客户知道产品是用Java编写的

2. 客户懒的帮助文档都不想看

  截至本文编写的时候,JDK官方最新版本为jdk 8u144,本文测试环境在虚拟机Windows XP,使用的版本为jdk-8u144-windows-i586.exe

Java 安装是使用 Microsoft Window Installer (MSI) 2.0 技术构建的。MSI 包含对静默或无人参与安装的内置支持。

  从Google搜索"java silent install"总结出了一些安装参数  

 /lang=<language ID> 安装特定语言包

  支持的语言包如下

语言   语言ID
英语 (en) 1033
法语 (fr) 1036            
德语 (de) 1031
意大利语 (it) 1040
日语 (ja) 1041
韩语 (ko) 1042
西班牙语 (es) 1034
瑞典语 (sv) 1053
简体中文 (zh) 2052
繁体中文 (zh_TW) 1028

经过笔者实测,设置语言ID为1041,即日语。安装命令:

jdk-8u144-windows-i586.exe /lang=1041

安装包界面如下

做对日外包的同学应该习惯于看到这个界面。这样就以日语语言环境安装JDK了。

WEB_JAVA = 1|0 Java浏览器支持 1启用 0禁用IEXPLORER = 1|0 IE浏览器支持  1启用 0 禁用(jdk1.8命令行实测无效)SPONSORS= 1|0   绕过赞助商,如浏览器插件,实测发现完整安装了JDKWEB_JAVA_SECURITY_LEVEL = VH|H|M|L  浏览器中运行的未签名 Java 应用程序的安全级别 非常高|高|中|低AUTO_UPDATE= 1|0   JDK自动检测更新 1启用 0禁用NOSTARTMENU= 1|0   创建开始菜单 1禁用 0 启动

当然你也可以安装后在控制面板找到Java设置安全级别

以上为JDK 7u10 release版本起的安装特性,Java早期的时候有一些应用就是通过Web Applet方式发布的,笔者工作早些年的时候一

家做ERP的单位他就是通过浏览器方式发布项目的,现今已经很少看到这样的企业应用,鲜见一些社区里的Demo程序会有Web Applet的示例程序。

/L install.log 记录安装日志

常规情况下Oracle公司已经帮我考虑到安装过程中遇到的问题,并且他也有自己的解决方法,这些都封装在安装包里,当然有时候如果需要查看java安装过程的操作,

或者在特殊情况下(静默安装)他都做了什么,或者是为了排错,我们需要记录日志。/L参数便应运而生。

/s 静默安装

此参数不需要赋值,直接带入安装命令行即可,启动后将在后台默默的安装直至安装完成结束。

ADDLOCAL = [[ToolsFeature],[SourceFeature],[PublicjreFeature]] 选择附加组件包各个参数可独立使用也可以组合使用
ADDLOCAL = ["ToolsFeature,SourceFeature,PublicjreFeature"] 安装开发工具/源代码/JRE
ADDLOCAL = ["ToolsFeature,SourceFeature"] 安装开发工具和源代码

除了以上命令还有很多配置方式或者参数,笔者没有一一测试,笔者最终的安装命令如下:

jdk-8u144-windows-i586.exe /lang=2052 /s /L c:\jdk-install.log INSTALLDIR=c:\embededJDK1.8 ADDLOCAL="ToolsFeature,SourceFeature" WEB_JAVA=0 AUTO_UPDATE=0 NOSTARTMENU=1

命令解释:笔者选择了简体中文静默安装,记录了安装日志到c:\jdk-install.log,JDK安装目录c:\\embededJDK1.8,另外还安装了开发工具和源代码组件包,禁用浏览Java插件,关闭JAVA自动更新,屏蔽了java开始菜单的创建。

安装后效果图如下:

从IE浏览器“工具”--"管理加载项"找不到java浏览器插件

开始菜单也没了Java的踪迹

windows注册表启动项也没有java的影子

当然文字不是到这里就结束了。

本文最终目的是要发送福利,在下面,笔者用C#写了简单的程序来静默安装JDK。

首先从java官方获得JDK的x86和x64版本分别改名为sdk-x86.bin和sdk-x64.bin

下面奉上代码(C#2.0 .NET Framework 2.0)

using System;
using System.IO;
using System.ComponentModel;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Threading;

namespace Starter
{
    class Enterance
    {
        static string JVM_Pattern = string.Empty;
        static bool hasFoundJVM = false;
        static string Target_JDK_FIlE = string.Empty;
        public static void Main(string[] args)
        {

            Console.WriteLine("按任意键开始安装xxx综合平台...");
            Console.ReadKey(true);
            Console.Clear();

            if(isFileMissed())
            {
                Console.WriteLine("安装文件丢失请联系技术人员");
            }else{
                doPreInstallCheck();
                if(hasFoundJVM){
                    installJVM(Target_JDK_FIlE);
                }
            }

            Console.ReadKey(true);
        }

        /// <summary>
        /// 判断主安装程序是否丢失
        /// </summary>
        /// <returns></returns>
        static bool isFileMissed()
        {
            return !File.Exists("setup.exe");
        }

        static String getArch()
        {
             return System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE",
                                                             EnvironmentVariableTarget.Machine);
        }

        /// <summary>
        /// 安装预检测
        /// </summary>
        static void doPreInstallCheck(){
            String arch =getArch();
            Architecture type= (Architecture)Enum.Parse(typeof(Architecture),arch);
            switch(type){
                case Architecture.AMD64:
                case Architecture.IA64:
                case Architecture.x64:
                        Console.WriteLine("发现{0}",EnumUtil.GetEnumDescription(type));
                        JVM_Pattern = "sdk.*x64.*";
                    break;
                case Architecture.x86:
                    Console.WriteLine("发现{0}",EnumUtil.GetEnumDescription(type));
                    JVM_Pattern = "sdk.*x86.*";
                    break;
            }
            string []files = Directory.GetFiles(Environment.CurrentDirectory,"sdk-*.bin");
            Action<string> action = new Action<string>(matchJVM);
            Array.ForEach(files, action);
        }

         private static void matchJVM(string jdkfile)
        {
             FileInfo fileInfo = new FileInfo(jdkfile);
             bool isMatched = Regex.IsMatch(fileInfo.Name,JVM_Pattern);
             if(isMatched) {
                 hasFoundJVM = true;
                 Target_JDK_FIlE = jdkfile;
             }
             if(Debugger.IsAttached)
                 Console.WriteLine("{0}与当前操作系统匹配的JVM:{1}",fileInfo.Name,isMatched);
        }        

        /// <summary>
        /// 安装JVM
        /// </summary>
        /// <param name="fileName">JDK文件名</param>
        static void installJVM(String fileName)
        {
            Console.WriteLine("即将安装程序,等待时间取决你电脑的性能");
            //https://stackoverflow.com/questions/3360555/how-to-pass-parameters-to-threadstart-method-in-thread
            Thread thread =new Thread(new ParameterizedThreadStart(DoSlientInstall));
            thread.Start(fileName);
            Thread.Sleep(5000);//等待安装进程启动
            FileInfo fileInfo = new FileInfo(fileName);
            InstallState state =new InstallState();
            state.processName =fileInfo.Name;

            Timer timer =new Timer(waitForProcessExitCallBack,state,0,1000);
            state.tmr = timer;

        }

        public static void waitForProcessExitCallBack(object target){
            InstallState state = target as InstallState;
            Timer timer = state.tmr;
            Process []allProcceses = Process.GetProcesses();
            bool isJDKProcExit  = true;
            foreach(Process proc in allProcceses)
            {
                string procName = String.Format("{0}",proc.ProcessName);
                if(Debugger.IsAttached)
                    Console.WriteLine("{0},{1}, {2}",procName,state.processName,procName.Equals(state.processName));
                if(procName.Equals(state.processName)){
                    isJDKProcExit = false;
                }
            }
            if(isJDKProcExit){
                Console.WriteLine("\r\n安装所需软件使用时间:{0}秒",state.counter);
                timer.Dispose();
            }else{
                Console.Write(state.delims);
                state.counter++;
                //Thread.Sleep(1000);
                //
                //timer.Change(1000,1000);
                //timer.Dispose();
            }            

        }

        //https://stackoverflow.com/questions/24918768/progress-bar-in-console-application

        //https://stackoverflow.com/questions/12354883/how-do-i-gracefully-stop-a-system-threading-timer
        static void DoSlientInstall(object fileName)
        {
            Console.WriteLine("安装进行中,请勿退出...");
            ProcessStartInfo pStartInfo = new ProcessStartInfo();
            pStartInfo.FileName = (String)fileName;
            pStartInfo.Verb = "runas";
            pStartInfo.Arguments = "/lang=2052 /s /L c:\\jdk-install.log INSTALLDIR=c:\\embededJDK1.8 ADDLOCAL=\"ToolsFeature,SourceFeature\" WEB_JAVA=0 AUTO_UPDATE=0 NOSTARTMENU=1";
            pStartInfo.UseShellExecute = false;
            System.Diagnostics.Process.Start(pStartInfo);
            //https://stackoverflow.com/questions/6050478/how-do-i-create-edit-a-manifest-file
            //System.Diagnostics.Process.Start((String)fileName,"/s");
        }
    }
    //http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Threading/Timer.html
    class InstallState{
        /// <summary>
        /// 时间计数器
        /// </summary>
         public int counter = 0;
         /// <summary>
         /// 进程名
         /// </summary>
         public String processName;
         /// <summary>
         /// 分隔符
         /// </summary>
         public string delims="*";

         public Timer tmr;
    }
}
using System;
using System.ComponentModel;
using System.Reflection;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;

namespace Starter
{
    /// <summary>
    /// 操作系统架构枚举类
    /// </summary>
    //https://msdn.microsoft.com/en-us/library/aa384274.aspx
    //https://ss64.com/nt/syntax-64bit.html
    public enum Architecture{
        [Description("64位操作系统")]
        x64 =0,
        [Description("AMD 64位操作系统")]
        AMD64=1,
        [Description("Intel64位操作系统")]
        IA64=2,
        [Description("x86架构操作系统")]
        x86=3
    }
    class EnumUtil{
        public static string GetEnumDescription(Enum enumValue)
        {
            string enumValueAsString = enumValue.ToString();

            Type type = enumValue.GetType();
            FieldInfo fieldInfo = type.GetField(enumValueAsString);
            object[] attributes = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
            {
                DescriptionAttribute attribute = (DescriptionAttribute)attributes[0];
                return attribute.Description;
            }

            return enumValueAsString;
        }
    }
}

安装效果图

参考资料

Installing With a Configuration File

Java 8 SE Documentation

How do I arrange a silent (unattended) Java installation?

Language IDs

Installing the JDK Silently

时间: 2024-12-21 18:14:17

[原创]自定义参数静默方式安装JDK1.8的相关文章

写自定义参数验证方式

本次发表文章距上次发表已近有两月有余,原因是两月前离开了上家公司(离开原因可能会在年终终结叙述,本篇暂且忽略),来到了现在所在的京东集团,需要花时间熟悉环境和沉淀一下新的东西,因此写文章也暂时没那么勤奋了,不得不说这次是机遇也是对自己职业生涯的一次重要决定. 话说本篇内容主要分享的是自定义方法参数的验证,参数的基本校验在对外接口或者公用方法时经常所见,用过hibernate的验证方式的朋友一定不会陌生,读完本篇内容能够很好的帮助各位朋友对自定义参数验证方式有一定了解: 自定义参数验证的思路 实战

静默方式安装10g数据库软件+升级patch+手工建库

通常我们安装Oracle数据库软件,都是用OUI图形界面来完成的,但有些Unix/Linux系统中并未安装图形系统,也就无法使用图形界面来安装Oracle的产品了,对于这种场景,就只能采用静默方式来安装了,Oracle提供了这种silent方式,主要是通过配置响应文件rsp来完成的. 一.静默安装10.2.0.1数据库软件 --解压安装包 [[email protected] u01]$ unzip 10201_database_linux32.zip [[email protected] u0

Linux平台达梦数据库V7单实例安装方式之静默方式

一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库支持多个操作系统平台的安装,本篇主要介绍Linux平台下的静默方式安装. 二 安装需求 2.1 硬件需求 用户应根据 DM 及应用系统的需求来选择合适的硬件配置,如 CPU 的指标.内存及磁盘容量等.档次一般应尽可能高一些,尤其是作为数据库服务器的机器,基于 Java 的程序运行时最好有较大的内存.

DBCA静默方式创建数据库实例

这两天装了几套开发环境的Oracle数据库,其中有11.2.0.4的版本也有12.2.0.1的版本.由于网络环境复杂,没有办法使用图形界面的方式安装,只能使用静默方式安装,之前也写过关于静默安装数据库软件和创建实例的博客http://hbxztc.blog.51cto.com/1587495/1884833有兴趣的可以参考,这两天用的也是这样的方法,但是之前看到有人在分享中使用过dbca的静默方法来创建数据库实例,还没有做过尝试,趁安装空闲的时间研究了一下,在此也做一个简单的分享. dbca有两

CentOS6.5x64采用静默模式安装64位oracle11g

1.下载oracle11g64位版本的源文件,并上传到Linux服务器,下载地址自行百度,若实在找不到请留言. 2.Package安装检查安装: 通过yum工具直接安装: yum -y install binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio-devel libaio libgcc libstdc++ li

Centos6.9安装Oracle11G(静默方式)

#oracle版本:oracle-11.2.0#下载oracle#创建安装文件存放目录mkdir /data/oracle_installcd /data/oracle_install#下载wget http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_2of2.zip?AuthParam=1512965381_2cdd5f6abb7868be3c8f4bb9b37038f2wget http://d

yum方式安装的jenkins的jvm参数修改及jvisualvm监控添加

yum 方式安装的jenkins 1.添加jvm参数修改时,需添加在/etc/init.d/jenkins 文件的JAVA_CMD变量里才生效 2.为了能用jvisualvm监控到,添加 -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=192.168.1.125 -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authent

SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1.1 GET 一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据 1.2 POST 一般用于插入数据 1.3 PUT 一般用于数据更新 1.4 DELETE 一般用于数据删除 技巧01:一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据) 2 参数获取注解 2.1

CentOS7下通过rpm方式安装MySQL及插入中文问题解决 [原创]

一 CentOS下通过rpm方式安装MySQL CentOS版本:CentOS-7 MySQL版本:MySQL-5.6.22 在网上搜了一下,Linux下安装MYSQL有三种方式: 1) 通过yum命令在线下载安装 2) 下载离线rpm安装包安装 3) 下载源码编译安装 方式1不打算用,因为我们大部分项目服务器是不能直接上Internet的,网上关于在线安装的教程很多,方式3对于只要应用MYSQL的人来说没必要多此一举. 1. 解压下载的zip包,会发现有以下几个rpm包: MySQL-clie