能否基于openjdk开发闭源软件

2024-05-10 21:18

本文主要是介绍能否基于openjdk开发闭源软件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenJDK的开源协议,闭源没问题

关于Open JDK的开源协议问题,在知乎上也遇到过好多次了,解释了不下三次,原本以为是有一定技术基础的人类,居然也搞不太明白这个协议,那就专门开一个专栏文章解释一下吧

JDK 11之前的Oracle JDK也就是我们日常去下载的那个JDK,以及Open JDK,用的都是GPL with Classpath Exception协议,而Oracle JDK在11之后,更改了使用协议,如果继续无脑用的话,会带来一定程度上的法律风险,很多用户因此开始考虑Open JDK,但是一看Open JDK的开源协议,哇,是臭名昭著的GPL(笑)就心有余悸,那是不是意味着我们写的所有代码都必需强制开源啊?很多用户就有这个担忧

且慢

Open JDK的开源协议真的是GPL吗?

不完全是

严格说来是GPL with Classpath Exception

这个协议分为两个部分,一个是GPL,但不是完全的GPL,还有一个with Classpath Exception,这个exception很重要,对于日常用户来说

我们知道,GPL是传染性协议,任何用了GPL开源协议的软件,都会被传染为强制开源,比如你用了某一个GPL开源协议的类库,那么用了该类库的所有代码,都必须开源,而且是用GPL开源协议开源,那就会带来很多安全领域的考虑

所以纯粹的GPL协议的软件,用起来有被强制开源的考虑

但是,OpenJDK妙就妙在它多了一个尾巴,with Classpath Exception,又称为with linking exception,什么意思?通俗点说,就是你用它的模块,比如Java代码里面,常见的import语句,是吧,比如import java.*, javax.*, javafx.* etc.等等,这些都属于exception里面的,也就是说,你只是import这些类库,并且使用它们的话,不受GPL协议影响,你大可以在此基础之上,制作自己的软件,并且闭源发布

那Open JDK为什么又要求GPL呢?什么情况下会被强制开源呢?很简单,你魔改了Open JDK的实现的话,比如你更改了java.base.jmod模块的源代码的话,那你的代码就会被GPL传染上,要求必需开源,否则就违背了Open JDK的开源协议,当初SUN这样做的目的很简单,就是为了防止出现不同版本的Java,否则IBM整一个Java,SUN整一个Java,互相之间代码还不兼容,那就麻烦大了,违背了Java最初的承诺,就是编译一次,四处运行,你用SUN JDK/hotspot编译并打出来的jar,有可能会不能在IBM JDK/j9上运行,那这个结果显然是大多数人所不愿意看到的,破坏了Java的兼容性。而且就算是魔改了实现,也有标准,就不是随便可以claim自己魔改后的版本是Java的,最好改个名字,比如Scala, Kotlin, Clojure etc.

那再给不放心的人吃个定心丸,有没有基于Open JDK闭源发布的软件啊?有啊,当然有啊,WebLogic, WebSphere都是这种软件,还有日本人,德国人做的一些软件,J2EE/Jakarta EE里面闭源的软件占了半壁江山

另外,使用该协议的,不仅仅是Open JDK,还包括Open JDK生态下的其他开源项目,比如Open JavaFX(OpenJFX),Graal等,用的也都是该协议,所以用这些工具也都没问题

基础软件,尤其是JVM这种,被强制GPL是有好处的,所有人的实现都是强制开源,一些别有用心的人如果在里面做了手脚,也容易被曝光,但是使用这些软件的软件,一般就是应用软件了,那就是差异化,不同软件在不同领域有不同的考虑,强制开源就不太合情理了,比如你写了一个电子政务的系统,被强制开源了,那还完蛋了

如果还有人不放心,那就这么说,我们已经全部迁移到Open JDK上去了,而且我们也制作闭源软件,确切滴说,是一个游戏,不仅做了,而且还告知了Open JFX的制作者们,制作者们都知道我们在干这事,他们在twitter上的反应是:哇,这玩意还能用来做游戏,太棒了

工程师们真是nice,感谢有这些开源软件和项目,让世界变得更加美好

所以Open JDK的协议没问题,放心用

bye

这篇关于能否基于openjdk开发闭源软件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977576

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件