ionic xcode 10.1 New Build System

现象:xcode升级后ionic的ios项目打包后不能上传app store

原因:xcode9开始苹果增加了一个New Build System的编译选项,但是当时没有设置为默认,从10开始,这个选项变成默认了,ionic的cordova还没有更新导致出现这个问题

办法1:
生成ios项目时后面增加一个选项:
ionic cordova build ios –prod — –buildFlag=”-UseModernBuildSystem=0″

这样就会使得项目仍然按照:Legacy Build System进行编译打包,经测试可以正常上传商店

办法2:
虽然可以使用Legacy Build System来打包 但是听起来好像“遗留的”有点LowB

所以我们还可以使用最新版本的cordova-ios(目前最新版是5.0.1 20190516)来解决
ionic cordova platform remove ios
ionic cordova platform add ios@5.0.1
ionic cordova build ios –prod

时间过得很快的,也许再过一段时间ionic默认的版本就会支持这个选项了

参考:

https://ionic.zendesk.com/hc/en-us/articles/360009511574-2018-09-21-Building-Locally-using-Xcode-10

https://stackoverflow.com/questions/53050108/xcode-10-how-to-switch-to-legacy-build-system

关于ckeditor4 html可视化在线编辑器的使用

已经有了ckeditor5为什么还要选择ckeditor4?

ckeditor5已经发布了很长时间,尽管一些新的功能比较前卫,但对于比价陈旧的浏览器比如IE8之类不能兼容。如果需要做一些国内电子政务管理系统,很多电脑还是xp、win7。

可能到2020年开发运行环境会有一些进化,到时候再研究一下ckeditor5,目前还是把ckeditor4先弄顺畅。

构建一个符合需要的ckeditor4

ckeditor4默认是有很多功能的,有些我们需要,默认没带,有些我们不需要,默认有。这就需要根据需求来定制ckeditor。

打开这个网址 https://ckeditor.com/cke4/builder 就可以自定义需要的功能和插件。

第一步 选择基于:Basic、Standard还是Full来构建

在之前生成zip包里有一个build-config.json,下次再打包的时候就不需要重新选择一遍,只需要上传这个配置文件即可。

三个版本

三者默认的功能对比如下

功能对比

第二步、根据自己的需要可以添加修改插件

选择插件
选择主题样式

最后、选择支持的语言并下载

选择界面语言
下载自定义版本

集成图片上传功能

编辑器上传图片的插件有很多,其中经过测试Upload Image比较好用

https://ckeditor.com/cke4/addon/uploadimage

client端配置:

config.extraPlugins = 'uploadimage'; //这个是要加载插件
config.uploadUrl = '/ckUploadFiles'; //url配置的地址必须服务端有效处理并能访问的到,返回格式是有相应要求的

上传成功时的返回:

  • uploaded – 成功的话返回 1. 这个地方只可能是1或者0,不会大于1,因为多个文件也是一次一个的上传的。
  • fileName – 上传的文件名.
  • url – 通过服务器访问上传文件的url.

上传失败的时候:

  • uploaded – 上传文件数量 0.
  • error.message – 需要给用户返回的错误信息.

server端配置:

接收的url需要在客户端指定,参数upload是一个上传文件对象数组

接下来就是服务端保存文件一套操作,不再多说,最后一定要按照返回格式给输出一个json。否则ckeditor不知道上传的结果。

默认样式的修改

在编辑器里面使用style来修改样式比直接设置字体大小、格式等要规范统一且不容易出错。

我们可以把常用的一些样式写在styles.js里面:

styles.js

OSS备份系统近期开发计划

后台权限

1、建立后台管理网站,对于销售出去的客户端进行管理和控制

2、可以添加代理商,代理商只能看自己的客户。

自动更新

客户端可以检测版本号自动更新,最好能自动下载安装包,下载完后只需要用户点击运行、下一步安装。

序列号管理

1、可以使用非对称加密算法,在服务器端用私钥生成签名的密钥数据(混淆的),客户端使用公钥验证,通过后才能运行,相当于序列号的管理

2、可以利用在线验证对比数据库中的销售记录,没有销售记录的客户端只能使用免费版功能。

运行时需要管理员权限问题

可以将数据文件放在AppData下,具体去的路径方法:

https://stackoverflow.com/questions/867485/c-sharp-getting-the-path-of-appdata

To get the AppData directory, it’s best to use the GetFolderPath method:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

%AppData% is an environment variable, and they are not automatically expanded anywhere in .NET, although you can explicitly use the Environment.ExpandEnvironmentVariable method to do so. I would still strongly suggest that you use GetFolderPath however, because as Johannes Rössel points out in the comment, %AppData% may not be set in certain circumstances.

Finally, to create the path as shown in your example:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

(转载)Bruce Eckel:编程生涯

Bruce Eckel 是编程界的大牛,著有大名鼎鼎的《Thinking in C++》和《Thinking in Java》。 本文是他对程序员(尤其是新手)的忠告。

================华丽的分割线================

大家总是问一个错误的问题:“我应该学习C++还是Java?”

在本文中,我将告诉大伙儿:对于选择编程生涯真正需要关注的是哪些问题。

请注意,这篇文章的目标读者并不是那些已经做出自己选择的人。(对于这些人而言)你会继续自己的编程生涯,而不管别人会怎么说。因为它已经渗透到你的血液中,你已经无法摆脱。

你已经知道答案:C++、Java、Shell脚本、Python、还有其它一大堆的语言和技术,你都理所当然地会去学习。甚至有可能你才仅仅14岁,就已经知道好几种不同的语言。 问我这样的问题的人可能来自其他行业,或者来自诸如Web开发之类的领域。他们知道HTML是一种类编程语言,而且想尝试构建某些更大型的应用。但我特别希望,当你在问这个问题时,你已经意识到了想要在计算机领域取得成功,你需要掌握自学能力,而且永不停息。

在这个领域做得越多,我越觉得软件开发比任何行业都更接近于写作。

我们从来不知道是什么造就了优秀的作者,我们只知道什么时候我们会喜欢某个人的文字。编程不是一种工程,仅需要把东西从入口倒进去,然后再转动手柄。把软件开发看成确定性的,是一个诱人的想法。因为这个想法,人们总想搞出一些工具来帮我们开发出想要的软件。但是我的经验告诉我,事实并非如此——人的重要性远高于流程。而软件是否运行在一部精确的机器上已经越来越不重要了——这犹如测不准原理对人类的影响。

我的父亲是造房子的,小时候我偶尔会帮忙打下手,放放砖块之类。他和他的木工告诉我,他们是为我好才让我干这些活——这样我就不至于走入这个行业。事实确实是这样。 我们不妨把软件开发比作盖房子。造房子的人当然不可能完全一样。这些人里面有:混凝土工、屋顶工、管道工、电工、砖瓦工、水泥工、瓦片工、搬运工、粗木工、细木工。当然,还有工头。每个工种都需要相应的技能,这些技能都需要花时间和精力去掌握。跟软件开发一样,造房子也是一个“建立/推翻”的过程。

如果你想很快地获得回报,你可能从搬运工和砖瓦工开始做,这样的话,你无需太多的学习曲线就可以获得回报。当需求很多时,你的工作会很稳固,甚至收入也可能提升——如果没有足够的人手的话。但是,一旦行情不妙,木匠甚至工头就可能把砖瓦工一脚踢开。

当互联网刚刚兴起时,仅仅是花一点时间学习HTML,你就可以得到一份薪水丰厚的工作。但是当形势惨淡时,对于技能的要求更高了——HTML程序员(就像搬运工和砖瓦工一样)第一个被抛弃了,而拥有更高技能的程序员则留了下来。

我想说的是: 除非你准备活到老学到老,不然的话,不要进入这个行业!编程看起来似乎是一个高收入而又稳定的工作。但要做到这一点,唯一的途径是:始终让自己更有价值。

当然,你总能找到例外。总有那么一些人,仅仅学了一门编程语言,就可以胜任留在一个岗位上,而不需要增长他的技能。但他们只是幸免于难而已,他们最终无疑是很脆弱的。为了不让自己变得脆弱,你需要持续的提高自己,通过阅读、加入用户组、参加研讨会……

你学得越深入,你就越有价值,也就意味着你有更好的职业前景,可以配得上更高的薪水。

另一个方法是:先大致了解这个领域,找到最适合你的地方。打个比方:我的兄弟对软件很感兴趣,也入了这行,只不过他的工作是安装、维修、升级电脑。他总是一丝不苟,所以当他把电脑搞好,一定会很完美——不光是软件,连电线都会被仔细地捆好。他总是生意兴隆,远超出他的精力所能及。他甚至都不用担心 .com 泡沫的崩溃。显然他的饭碗不容易被抢走。

我在高校里待了很久,甚至还在UCLA(加州大学洛杉矶分校)进修博士学位,后来又幸运地终止了。我说“幸运”是因为我不再喜欢呆在学校,而我之前在高校待了那么久,只是因为我很享受它。但我所享受的,基本上是不务正业的东西——艺术和舞蹈课,在校报工作,还有一小撮计算机课程(之所以说计算机课程“不务正业”,是因为我本科是物理专业,研究生才是计算机专业)。虽然我在学术上远谈不上卓越(有意思的是很多当时也许不会接受我这个学生的学校现在却用我的书做教材)。我真的很享受作为学生的日子,当我完成博士课程,也许会以一个教授的身份终老一生。

但就如现在看到的,我在学校里最大的收获恰恰来自我那些“不务正业”的课程,它们拓展了我的思维,使之超越了“我们已经知道的东西”。在计算机领域中,你总是为某种目标而编程。你对目标了解得越多,你就做得越好。我遇到过一些欧洲的研究生,他们需要结合其它专业领域来搞编程,他们的论文需要解决这个专业领域的特定的问题。

了解编程之外的领域,将会极大得提高你解决问题的能力 (就如同多学几种编程语言将极大地提高你的编程技能)。

很多时候,我发现仅仅学习计算机专业的学生,比那些(除了计算机之外)拥有其它背景的学生,在思维上有更多的局限性。因为后者有着更严谨的思维,也不那么容易想当然。 有一次我组织了一次会议,其中一个议题是:理想的应聘者有哪些特征:

◇把学习当成生活方式。比如:你应该知道不止一种语言,没有什么比学习一门新语言更能让你开阔眼界了。

◇知道如何获取知识

◇Study prior art

◇善用工具

◇学会把事情简化

◇理解业务

◇为自己的错误负责。“我就是这样的”是不能接受的托词。能找到自己的失误。

◇成为一个领导者,善于沟通和激励。

◇搞清楚你在为谁服务

◇没有绝对正确的答案(更好的方法总是存在的)。展示并讨论你的代码,不要带着感情因素——你的代码并不等于你本人。

◇明白完美是渐进的

适当尝试一些冒险——尤其是能令人感到害怕的冒险。当你尝试之后,将体会到出乎意料的兴奋。(在冒险的过程中)最好不要刻意去计划某个特定的结果。当你过于注重结果,你往往会错过那些真正有价值的问题。我的冒险往往是这样开始的——“我们先做些试验,看看它会把我们带到什么地方”。

或许某些人会对我的回答感到失望,并回复我说:“是的,这很有趣也很有用。但我到底应该学什么?C++还是Java?”

我再重复一次:并不是所有的问题都有一个唯一的简单的答案。问题的关键不在于选择某个编程语言,然后掌握之。问题的关键在于:持续学习,并且很多时候,有不止一个选择。

相信我所说的,你的生活会更精彩! 洋文原始出处: http://www.artima.com/weblogs/viewpost.jsp?thread=259358

10个常见的缓存使用误区

在日常工作中,开发者经常利用缓存来进行优化站点或优化应用程序。但在实际应用中,在使用缓存时,总是那么不尽如意。这什么原因呢?本文,笔者收集了最为常见的十大缓存误区以及使用建议。我们一起来看下 :

1.  依赖默认的序列化。

默认的序列化处理方式可能会消耗大量的CPU资源,特别是处理复杂类型数据时。所以建议要根据语音和环境的不同,采用最优化的序列化和反序列化方式。

2.  在单一缓存中存储大对象数据。

由于序列化和反序列化需要一定的资源开销,处于并发负载时,大对象图形数据的频繁读取有可能会让服务器的CPU崩溃。相反,不妨考虑把大对象数据打散为较小的子对象,之后再各自进行缓存。根据你的需求读取最小的数据单元。

3.  在不同进程间使用缓存共享对象。

出现竞态条件(Race conditions)时,当写进程也参与其中,同时刚好程序的某部分也访问同一缓冲对象,情况会变得更坏。采取外部锁机制是有必要的。

4.  储存数据后立马进行缓存。

千万不要仓促行事,即使是刚写入不久,当存储资源紧张时,一个缓存足以阻碍程序运行。所以用代码来进行缓存空值返回检查是很有必要的。

5.  使用嵌套对象存储全集合。

由于序列化的影响,执行一次全集合存储会导致程序运行变慢。有鉴于此,单独对独立对象进行缓存可以实现分开读取,减少序列化影响。

6.  对父子对象采取统一与单独混用的存储方式。

有时候一个对象可能拥有两个或更多的父对象。根据统一对象本身的键进行缓存以便不会把同一对象存储于不同地方,这样父对象可以按需访问子对象。

7.  对配置信息进行缓存。

使用进程的本地静态变量来存储配置数据。缓存数据访问是有代价的,所以要尽可能把影响减到最低。

8.  对活性对象进行缓存,例如:流,文件,注册信息或者网络。

不要尝试对上述等包含引用信息的活性对象进行缓存。因为当缓存数据被删除后,之前缓存的活性对象不会被删除,这样会造成系统资源泄漏。

9.  对同一对象采取多键存储。

这样或许在使用一个键和索引号来进行访问时带来便利。如果一个缓存是in-memory的,这样做是可行的,因为缓存中包含了同一对象的引用信息,也就是说一旦该对象发生变更,都可以透过两边的访问路径进行查看。如果是远程(外部)缓存,任何变更的发生都是不可见的,所以这样会导致同步问题的产生。

10.在连续存储中进行更新或删除后没有及时更新相应缓存对象。

在一个远程缓存中,数据以拷贝方式存储,所以当更新对象时,缓存不会被同步更新。缓存必须被明确指定,才能根据变更而进行更新。在in-memory缓存中,一个对象发生的变更是对所有人可见的。在删除时情况类似,删除一个对象时,在缓存中不会被同步删除。这取决于程序本身如何确保缓存对象被正确删除。

英文出自:highscalability

]]>

安装 Tomcat 7 的通用方法(带 jsvc & APR 的源码编译和安装方法)【转】

有些 Linux 发行版在源里已经带有 Tomcat 7,只需使用相应的包管理工具就可以直接安装。比如 Arch Linux,安装和配置方法都很简单,具体的可以参阅我的上一篇《Arch Linux 环境下使用 Tomcat 6 搭建多站点、带SSL证书、高性能NIO/APR网站的配置详解》 。不过也有些 Linux 发行版的源里没有 Tomcat 7,这时就需要使用通用的方法安装了。

1、前提准备

在安装 Tomcat 7 之前需要先确认系统里是否已经安装 jdk、gcc 和 make,另外在编译 APR 时需要 apr,apr-devel,openssl,openssl-devel,因为这些包在一般的 Linux 发行版的源里都有,直接用包管理工具安装就可以了,如果没有则可以通过源码方式安装,因为这不是本文的重点,这里就不展开了。

需要注意的,假如你系统里同时有 Oracle/Sun JDK 和 OpenJDK,则可以通过这篇文章介绍的方法切换。安装好 jdk 之后记得设置 JAVA_HOME 环境变量(下面的编译步骤将会用上),在 ~/.bash_profile 里加入即可,比如:

export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk

2、安装 Tomcat 7

实际上安装 Tomcat 非常简单,只需下载压缩包然后展开来就完成了。即在 Tomcat 官方网站下载 tar.gz 压缩包,然后展开,位置既可以是 /usr/local 之类的目录,也可以在自家目录($HOME)里。下面是假设在自家目录里创建了一个名为 “programs” 目录,将 Tomcat 展开到这个目录,并且创建一个符号链接 “tomcat” 指向展开的目录。然后添加 CATALINA_HOME 环境变量(代表 Tomcat 的安装目录,下面的编译步骤将会用上)到 .bash_profile,即:

export CATALINA_HOME=$HOME/programs/tomcat

为了下面的编译工作能进行,还需将 .bash_profile 内容导入到当前环境,即:

$ source ~/.bash_profile

现在已经可以运行在 $CATALINA_HOME/bin 里的 startup.sh 启动 Tomcat 服务,运行 shutdown.sh 停止服务了。

3、安装 APR

默认情况下 Tomcat 使用 BIO 连接器工作,为了提高并发性能,在生产环境中一般会使用 NIO 或者 APR 连接器,使用 NIO 连接器只需更改一下 Tomcat 的配置文件($CATALINA_HOME/conf/server.xml)即可,但 APR 则需要从源码编译安装。

转到 $CATALINA_HOME/bin 目录,展开压缩文件 tomcat-native.tar.gz,然后进入里面的 “native” 目录,先配置一下:

./configure --with-apr=/usr/bin/apr-1-config \
                --with-java-home=$JAVA_HOME \
                --with-ssl=yes \
                --prefix=$CATALINA_HOME

需要注意的是 –with-apr 参数的值是 apr-config 文件的路径,一般 Linux 发行版在安装 apr-devel 包时会安装在 /usr/bin/apr-1-config,如果你的环境不是的话,可以用 find 命令搜索一下 “apr*config” 确定具体的位置。

配置没问题的话就可以编译和安装了:

$ make
$ make install

你将会发现在 $CATALINA_HOME/lib 目录里多出 libtcnative 之类的库,在 $CATALINA_HOME/bin 目录里编辑(没有的话则新建)setenv.sh 文件(这个文件用于添加 Tomcat 启动参数),增加如下两行:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

现在重新启动 Tomcat 服务就会自动应用上 APR 连接器了,检验的方法也很简单,查看 Tomcat 的日志输出文件(位于 $CATALINA_HOME/logs)catalina.out,如果发现有如下标有红色字的行即表示 APR 已经应用成功:

Feb 23, 2012 12:07:00 PM org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.22. Feb 23, 2012 12:07:00 PM org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], ra ndom [true]. Feb 23, 2012 12:07:01 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler [“http-apr-8080”]

4、以 Daemon 方式运行 Tomcat

在 $CATALINA_HOME/bin 目录下有个脚本 daemon.sh 用于以 daemon(守护程序、服务)方式运行 Tomcat,这个脚本会调用 jsvc 启用 Tomcat。通过 jsvc 你除了可以以 daemon 方式运行 Tomcat 之外,还能以普通用户身份让 Tomcat 打开小于 1024(比如 80 和 443)的网络端口。

下面先尝试修改 Tomcat 主配置文件 server.xml,将其中默认 Connector 的 8080 和 8443 端口修改为 80 和 443,修改后的连接器如下:

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

这时如果用 startup.sh 启动 Tomcat 的话会在输出日志看到 “Socket bind failed: [13] Permission denied” 的错误,这是因为 1024 以下的网络端口只能通过 root 权限打开,一般我不愿意使用 root 权限运行 Tomcat。

转到 $CATALINA_HOME/bin 目录,展开压缩文件 commons-daemon-native.tar.gz,进入展开后的目录先配置一下:

./configure

如果它提示你没找到 Java 安装目录的话,则需要添加 –with-java 参数,参数值是 Java 的安装路径,比如:

./configure --with-java=/usr/lib/jvm/java-1.6.0-openjdk

没问题的话就可以开始编译了,即:

$ make

你会发现当前目录产生一个名字为  jsvc 的可执行文件,把这个文件复制到 $CATALINA_HOME/bin 目录即可。

现在还要修改一下 setenv.sh 文件,添加几个参数,如下:

JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
TOMCAT_USER=yang
JSVC_OPTS='-jvm server'
JAVA_OPTS='-server -Djava.net.preferIPv4Stack=true'

其中 JAVA_HOME 是 Java 的安装目录;TOMCAT_USER 是你准备用哪个用户身份来运行 Tomcat,默认会用名为 “tomcat” 的用户(系统里没有的话需要手动创建),有时懒得修改权限也可以直接使用当前登录的用户;JSVC_OPTS 是 jsvc 启动的参数,JAVA_OPTS 是 Java jvm 参数。具体的值可以根据自己的需要来调整。

现在可以通过如下命令启动 Tomcat 了:

$ sudo ./daemon.sh start

使用如下命令停止:

$ sudo ./daemon.sh stop

参考资料

]]>

How To Manually Install Oracle Java on a Debian or Ubuntu VPS

Introduction Java is a programming technology originally developed by Sun Microsystems and later acquired by Oracle. Oracle Java is a proprietary implementation for Java that is free to download and use for commercial use, but not to redistribute, therefore it is not included in a officially maintained repository. There are many reasons why you would want to install Oracle Java over OpenJDK. In this tutorial, we will not discuss the differences between the above mentioned implementations. Assumptions This tutorial assumes that you have an account with DigitalOcean, as well as a Droplet running Debian 7 or Ubuntu 12.04 or above. You will need root privileges (via sudo) to complete the tutorial. You will need to know whether you are running a 32 bit or a 64 bit OS: uname -m x86_64: 64 bit kernel i686: 32 bit kernel Downloading Oracle Java JDK Using your web browser, go to the Oracle Java SE (Standard Edition) website and decide which version you want to install: JDK: Java Development Kit. Includes a complete JRE plus tools for developing, debugging, and monitoring Java applications. Server JRE: Java Runtime Environment. For deploying Java applications on servers. Includes tools for JVM monitoring and tools commonly required for server applications. In this tutorial we will be installing the JDK Java SE Development Kit 8 x64 bits. Accept the license and copy the download link into your clipboard. Remember to choose the right tar.gz (64 or 32 bits). Use wget to download the archive into your server: wget –header “Cookie: oraclelicense=accept-securebackup-cookie” http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.tar.gz Oracle does not allow downloads without accepting their license, therefore we needed to modify the header of our request. Alternatively, you can just download the compressed file using your browser and manually upload it using a SFTP/FTP client. Always get the latest version from Oracle’s website and modify the commands from this tutorial accordingly to your downloaded file. Installing Oracle JDK In this section, you will need sudo privileges: sudo su The /opt directory is reserved for all the software and add-on packages that are not part of the default installation. Create a directory for your JDK installation: mkdir /opt/jdk and extract java into the /opt/jdk directory: tar -zxf jdk-8u5-linux-x64.tar.gz -C /opt/jdk Verify that the file has been extracted into the /opt/jdk directory. ls /opt/jdk Setting Oracle JDK as the default JVM In our case, the java executable is located under /opt/jdk/jdk1.8.0_05/bin/java . To set it as the default JVM in your machine run: update-alternatives –install /usr/bin/java java /opt/jdk/jdk1.8.0_05/bin/java 100 and update-alternatives –install /usr/bin/javac javac /opt/jdk/jdk1.8.0_05/bin/javac 100 Verify your installation Verify that java has been successfully configured by running: update-alternatives –display java and update-alternatives –display javac The output should look like this: java – auto mode link currently points to /opt/jdk/jdk1.8.0_05/bin/java /opt/jdk/jdk1.8.0_05/bin/java – priority 100 Current ‘best’ version is ‘/opt/jdk/jdk1.8.0_05/bin/java’. javac – auto mode link currently points to /opt/jdk/jdk1.8.0_05/bin/javac /opt/jdk/jdk1.8.0_05/bin/javac – priority 100 Current ‘best’ version is ‘/opt/jdk/jdk1.8.0_05/bin/javac’. Another easy way to check your installation is: java -version The output should look like this: java version “1.8.0_05” Java(TM) SE Runtime Environment (build 1.8.0_05-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode) (Optional) Updating Java To update Java, simply download an updated version from Oracle’s website and extract it under the /opt/jdk directory, then set it up as the default JVM with a higher priority number (in this case 110): update-alternatives –install /usr/bin/java java /opt/jdk/jdk.new.version/bin/java 110 update-alternatives –install /usr/bin/javac javac /opt/jdk/jdk.new.version/bin/javac 110 You can keep the old version or delete it: update-alternatives –remove java /opt/jdk/jdk.old.version/bin/java update-alternatives –remove javac /opt/jdk/jdk.old.version/bin/javac rm -rf /opt/jdk/jdk.old.version The installation procedure documented above is confirmed to work on a Debian server, but can also be applied to an Ubuntu server. If you encounter any problem after following all the steps, please post a comment below.]]>