没有Javax的Jakarta EE:这次世界也不会结束

如果您错过了新闻, Oracle将向Eclipse基金会捐赠Java EE规范 。 这项决策在规范过程中经历了相当长时间的休眠,在此过程中,人们理所当然地怀疑Oracle对Java EE失去了战略兴趣。 起初,Java EE和更广泛的Java社区很好地满足了捐赠规范的决定。 在没有Oracle减慢流程速度的情况下,Java EE涉及人员可以再次尝试关闭非标准化的API。 直到今天,由于Oracle和Eclipse基金会对捐赠的一些细节仍存在分歧,因此捐赠过程尚未完成。

在推翻所有知识产权的同时,Oracle在规范的新家中使用其Java品牌的方式也不太慷慨。 Java EE当然包含Oracle拥有的开放源代码但受商标保护的平台的名称。 这在法律上带来了一个问题:如果您授权第三方使用您的品牌名称,那么您就产生了将来限制其使用的权利。 更糟的是,在涉及与品牌有关的诉讼时,您可能会削弱自己在法庭上的地位。 甲骨文和谷歌在Java许可问题上争论了多年,因此人们可以预料到商标将是一个困难的讨论点。 而且,在不假装对国际商标法了解太多的情况下,更多参与其中的人告诉我,“使用它或失去它”对于理解此类分歧的总体座右铭来说已经足够好了。 因此,首先将规范从Java EE重命名为Jakarta EE,以避免利益冲突。

但是,新成立的雅加达EE社区真正令人震惊的事情尚未到来。 经过几个月的讨论,有关捐赠的形式,Eclipse基金会了解到,它既不能拥有托管Java EE中定义的API的当前javax名称空间的所有权。 相反,现在计划为所有捐赠的API休眠此名称空间。 因此,应该在Jakarta EE的规范过程中创建的任何新API都应托管在新的命名空间中,以避免侵犯Oracle的商标。

在这一点上,弄清楚这意味着什么很重要。 不禁止Jakarta EE和Eclipse Foundation使用javax命名空间或实现其API。 当前存在的API都不会被删除。 但是,在新形成的Jakarta EE规范过程中创建或更新的任何API都将需要存在于一个新的名称空间中,该名称空间很可能模仿现有的名称空间,但以jakarta作为其前缀而不是javax。 例如,如果要将新方法添加到
javax.servlet.Servlet接口,该servlet规范的下一版本将需要发布一个名为
jakarta.servlet.Servlet而不是将此方法添加到现有API。

我不是Java EE用户,我为什么要关心?

正式地,大多数人都知道Java平台分为两个部分。 第一部分是Java SE,其中所有API均在带有java前缀的软件包中定义。 除此之外,Java EE的指定E X内java的X命名空间抚育的API。 这些API并不意味着特定的实现,而仅定义由Java EE兼容组件的不同供应商实现的行为。

在这种情况下,Java EE是几个互不依赖的API规范的统称。 例如,Java消息传递规范(JMS)定义了一个用于与消息队列进行交互的API,而Java servlet规范定义了一个用于将调用分派到Web服务器的API。 实际上,据我所知,没有Java EE应用程序运行时实现了Java EE规范过程中定义的所有API。 一些Java框架甚至只专注于实现一个规范。 例如,Jetty Web服务器仅实现Java servlet规范。 因此,如果您通过Spring Boot使用Jetty,即使您没有直接与规范交互或认为自己是Java EE用户,您还是Java EE的正式用户。

尽管有这种形式上的区别,即使您只编写了普通Java而没有包括任何外部依赖关系,您也可能会遇到Java EE及其javax名称空间。 这是因为选定的Java EE API与JVM的标准映像捆绑在一起。 除了API之外,JVM还附带了该API的默认实现,以使用户能够轻松解决常见任务。 例如,JAXP是Java EE规范,它定义了用于在Java中处理XML的API。 XML处理是一项常见的任务,尤其是在面向企业的Java平台上,将XML包含在内是一个合理的选择。 对于JAXP,其假定的通用用法在今天仍然是事实,但是其他与JVM捆绑在一起的Java EE规范的老化程度也不尽相同。 例如,对于大多数Java开发人员而言,SOAP消息传递不再是首选,因此JVM捆绑的JAX-WS实现已成为大多数用户的负担。 为了减少JVM的占用空间并在Java 9中引入Java模块系统,一些Java EE API已移至已弃用的模块,这些模块计划在将来的版本中删除。 当然,这并不意味着模块的API本身已被弃用。 JAX-WS仍然活跃并且被许多人积极使用。 但是,由于不赞成使用此模块,希望在将来的Java版本中继续使用JAX-WS的人员必须将其作为显式依赖项添加。

在我们在虚拟化硬件上运行微服务的时代,减少JVM的占用已成为发展JVM的明显目标。 但是,从基本JVM映像中删除Java EE API的另一个好处是。 通过要求用户包括对Java EE API的显式依赖,升级Java运行时和Java EE不再捆绑在一起。 在Java 8之前,管理此类版本依赖性一直很乏味。 如果您不控制将应用程序部署到的JVM的确切版本,则尤其如此。 在Java 8之前,JVM仅允许通过将jar文件放入JVM的扩展文件夹中来覆盖隐式的Java EE依赖关系。 但是,当您与也会受到影响的其他Java进程共享JVM安装时,这当然是有问题的。 另外,仍然需要对正在使用的JVM安装进行控制。 为了解决此问题,尽管继续进行按需捆绑,但Java模块系统默认不再解决不推荐使用的Java EE模块,这使得可以在JVM中包含显式版本,同时还提供了一种激活旧版兼容性的简单方法。

为了使事情变得更加复杂,一小部分Java EE API变成了不允许简单分离的Java SE。 例如,JDBC规范分为“客户端”和“服务器端”需求,其中前者正式属于Java SE,而后者则属于Java EE。 这种区别来自最初的Java哲学,在Java哲学中,Java SE用于面向用户的桌面应用程序,而Java EE用于多个并发用户使用的服务器应用程序。 本着这种精神,例如,JDBC连接接口是在java.sql包中定义的。 毕竟,桌面用户当然可能要连接到数据库。 另一方面,由于仅将连接池视为多线程服务器应用程序的要求,因此在javax.sql包中定义了JDBC DataSource接口。 从今天的角度来看,这种分离当然不再有意义,但是名称空间和形式上的区别直到今天仍然存在。

当然,在由OpenJDK项目管理的Java SE和现在由Eclipse基金会管理的Jakarta EE内,分别使JDBC API演变是没有意义的。 因此,并不是将Java EE规范的所有部分都捐赠给了Eclipse,因此将为JDBC API保留javax.sql命名空间,该JDBC API现在被认为仅是Java SE的一部分。 保留此类API的其他示例是JMX API,它严重依赖于本机JVM支持。 当然,所有一直被认为是Java SE一部分的其他API(例如也以Java扩展名称空间结尾的Swing API)将保留在其原始包中。

向后兼容性呢?

要记住的重要一点是,无论是现在还是将来,目前都不会消失现有的javax API。 我个人也希望Jakarta EE现在包含的规范能够在未来很多年内支持javax命名空间。 实际上,对于大多数Java EE实现而言,处理多个名称空间并不是什么新鲜事物,但始终是一个重要的主题。 例如,当用JPA规范定义的注释逐步替换其注释时,Hibernate库已经成功完成了类似的迁移。 在另一个示例中,Spring框架与其本机注释并行地支持Java EE CDI规范。 这样做,例如,可以通过使用
javax.inject.Inject注释或Spring的本机Autowired注释。 一旦将Inject批注转移到jakarta包中,我将期望Spring框架同时支持Java EE和Jakarta EE命名空间,正如我也期望Java企业API的其他实现者支持它一样。

随着Jakarta EE成为Java EE的继任者,我不希望这种支持的实现或维护成本太高,因为应用程序服务器供应商可以简单地实现委托给现已过时的Java EE API的Jakarta EE包装器类。 例如,通过定义类似于以下内容的包装器类,可以在内部将Java EE servlet视为Jakarta EE servlet:

 public class LegacyServlet implements jakarta.servlet.Servlet { private final javax.servlet.Servlet delegate; public LegacyServlet(javax.servlet.Servlet delegate) { this .delegate = delegate; } @Override public void service(jakarta.servlet.ServletRequest req, jakarta.servlet.ServletResponse resp) { delegate.service( new LegacyServletRequest(req), new LegacyServletResponse(resp)); }  } 

如果Jakarta EE的目标是(逻辑)向后兼容当前规范和API,那么这应该相当简单。 如果遵守此原则,则还要求API的用户仅更新到Jakarta命名空间,以防他们想使用已经需要更改代码的新功能。 因此,我希望更改后的名称空间不会对未来的Jakarta EE用户产生太大影响,而主要是那些实现其API的人的关注。 回顾过去对Java平台的其他更根本的变化,当引入Java模块系统时,也是如此,例如,Java模块系统主要涉及库和框架开发人员,而很少涉及Java的最终用户。

当然,对这两种名称空间的支持永远不会通用,尤其是从长远来看,因此,Java EE API的用户最终将需要对过渡做出反应。 鉴于该规范保留了其API的二进制兼容性,但不包括名称空间前缀的更改,因此,我确实认为移植软件应该易于克服,甚至可以自动化。 任何Java类都在每个类文件的常量池中引用其导入的类型。 对于使用新的jakarta前缀来修补工件的所有常量池中的所有相关类型引用的工具而言,这将是微不足道的。 这样做,Java EE的旧用户可以避免在被动维护下对其应用程序进行源代码更改,而仅在编译后应用此类更改,甚至在部署期间修补工件。

是什么推动了Oracle?

我当然是软件顾问,而不是国际商标管辖权的专家。 我对Oracle的决策过程也没有任何见解。 因此,请把这最后一部分当作有根据的推测,加上我的个人观点,而不是事实摘要。

Java社区中的一些声音当前正在指责Oracle通过限制Javax名称空间的使用来违反Java及其用户的利益。 在Eclipse基金会中也进行了激烈的辩论,以至于有人建议以这种方式捐赠Java EE,因为它与组织的目标和价值不兼容。

鉴于这一更改确实对Java用户带来了巨大的工作量,因此当然可以很快得出这一观点。 但是,我无法想象Oracle会轻率地做出这个决定。 甲骨文正在并且一直在Java平台上进行大量投资-Java至今还没有像现在这样活跃-但是它也改变了其战略定位。 对我而言,甲骨文在进行这些投资时并不“关心” Java社区的想法根本不合适。

那么,我认为该决定的动机是什么? 对我来说,限制与Java EE无关,而是关于Oracle保护其对Java SE的兴趣。 归根结底,甲骨文正在向Java投资以获利。 通过允许使用其商标,甲骨文将放弃对其品牌的控制权,从而使这一目标陷入危险。 当然,Oracle依靠Java来开发自己的产品并因此维护它。 但是与此同时,该公司试图创建一种战略模型,以证明为数百名从事Java工作的全职高素质员工提供资金。

显然,甲骨文正在推动销售云解决方案,并且鉴于该公司除了实力雄厚之外,目前在运行时和数据库方面的主导地位,我相信他们在该领域获得重要市场份额的机会比许多人预期的要好。 Oracle在核心平台上取得成功的另一个计划是对Graal VM及其编译器的投资,这当然也为Java语言在资源受限的环境(如容器内)中提供了更广泛的应用范围。

但是,尽管在某些领域进行投资,Oracle肯定也在寻找削减成本的方法,并终止不再具有战略意义或盈利能力不足的企业。 尽管让用户(包括我自己)感到沮丧的是, 像Java飞行记录器这样的成功的项目团队被解雇了 ,但考虑到绝大多数Java开发人员都不需要这种工具,这是有道理的。 我相信Java EE既不适合Oracle的计划,也不适合该平台的成本概况,并且怀有类似的信念。

有鉴于此,Oracle可能考虑了放弃该规范与将其捐赠给其他人维护之间的权衡。 尽管捐赠Java EE的选择似乎是没有成本的,但是Oracle无疑会为此做出冒险。 通过允许竞争的组织继续他们在Java EE中的努力,这些努力还可以增强他们在Java SE领域与Oracle竞争的能力。 在Red Head和IBM参与了云解决方案市场竞争的那些组织中,尤其如此。 通过保护其商标权,Oracle的目标仅仅是降低竞争对手使用Java EE争夺Java SE市场份额的风险。 公平地说,Oracle为Eclipse基础提供了一种继续使用javax名称空间的方法。 但是,这将需要基金会将自身限制为将其产品与Java SE认证的JVM实现捆绑在一起,而不是例如将其自己的IBM捐赠的OpenJ9捆绑在一起 。 这样做,尽管Eclipse使用了javax名称空间,Oracle仍将保留对其品牌的足够控制权,但是同时,签署如此广泛的协议也不符合该基金会的利益是可以理解的。 只是不意味着如此,因此,甚至有人可能会认为Eclipse首先是接受Java EE捐赠的错误选择。

接下来是什么?

在开源社区中,我们经常大声讨论我们的工作资金不足。 而且,尽管缺乏盈利能力对于单个开发人员来说难以解决,但对于大型公司(无论是Oracle还是当前讨论中涉及的任何其他公司)而言,这当然也是一个问题。 在我看来,通过Oracle捐赠Java EE的知识产权,Java社区已经移交给了该规范的最重要的价值,我们应该集中精力处理已有的东西,而不要因附加的字符串而过度分散注意力。 就个人而言,如果甲骨文失去了对Java品牌的兴趣而不是站稳了脚跟,我将更加担心Java的未来。

对于Jakarta EE,我都不认为即将到来的名称空间迁移是规范面临的最大问题。 甚至在最近的停滞期之前,许多开发人员就对Java EE的灰尘感到沮丧。 我认为,问题是该过程的一部分。 实际上,Java EE规范通常来自领先框架的实现。 如果另一个框架想要重新发明如何通过更好的API解决相同的问题,则需要不断批评该框架不遵守该标准。 尽管事实是该标准通常只是先前最佳实践的快照,但所有这些。 因此,我希望Jakarta EE可以专注于其发展,而不是过多地保留其过去。 有了引人注目的最先进的API,如果它使我免于实现最小改动的迭代,那么我就不必担心调整代码。
jakarta.servlet.Servlet API。

翻译自: https://www.javacodegeeks.com/2019/05/jakarta-ee-without-javax-world-wont-end-time-either.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NS3Gym python侧代码分析

argparse库参考链接: https://docs.python.org/zh-cn/3/howto/argparse.html

火狐浏览器常用操作

1 建立书签文件夹并在标签栏显示 https://zhidao.baidu.com/question/1510197150305270220.html

pat乙级 1007 素数对猜想(C++)

题目 让我们定义dn为&#xff1a;dn pn1 −pn &#xff0c;其中p​i​​ 是第i个素数。显然有d​1​​ 1&#xff0c;且对于n>1有d​n​​ 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<105 )&#xff0c;请计算不超过N的满足猜想…

如何在不增加人员的情况下自动化API安全程序

在这篇文章中&#xff0c;我们将撰写一篇综合文章&#xff0c;内容涉及如何在不增加人员的情况下自动执行API安全程序。 在现代世界中&#xff0c;数据对于提供者和消费者都至关重要。 数据科学的出现证明了这一事实。 对于某些组织&#xff0c;整个业务模型是建立在信息交换之…

python错误bug调试问题汇总

1 Python-出现“Non-ASCII character ‘\xe6‘ in file“错误解决方法 2 python中for循环语句使用 3 Python解决两个整数相除只得到整数部分问题 4 python2的print和python3的print()

pat 乙级 1001 害死人不偿命的(3n+1)猜想(C++)

题目 卡拉兹(Callatz)猜想&#xff1a; 对任何一个正整数 n&#xff0c;如果它是偶数&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇数&#xff0c;那么把 (3n1) 砍掉一半。这样一直反复砍下去&#xff0c;最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公…

C++编译的bug解决方法

1 编译错误 jump to case label [-fpermissive]

jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器

jpa 测试该帖子与 Aslak Knutsen &#xff08; aslakknutsen &#xff09;一起撰写。 JPA类型转换器为定义实体属性如何持久存储到数据库提供了一种简便的方法。 您可以使用它们来实现许多不同的功能&#xff0c;例如&#xff0c;如上一篇文章中所示&#xff1a;加密数据&…

pat 乙级 1002 写出这个数(C++)

题目 读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入与输出 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10^​100​​ 。 输出格式&#xff1a; 在一行内输出…

详细介绍 安装ns3步骤

安装ns3步骤&#xff1a; 准备工作—— 1.[Linux] ubuntu系统安装完成 2.熟悉Linux常用命令 开始安装—— 确保ubuntu已经完成换源---阿里云或清华,个人推荐阿里云 3.安装组件和依赖库 1.快捷键CtrlAltT 打开终端&#xff0c;输入以下命令&#xff1a; sudo apt-get update …

在硒中查找具有链接文本和部分链接文本的元素

Selenium中CSS定位器是一个基本概念&#xff0c;每个旨在使用Selenium执行自动化测试的测试人员都应该意识到这一点。 在Selenium中充分使用CSS定位器可以帮助您以更高效&#xff0c;更彻底的方式执行测试。 我从7年以来一直从事自动化测试行业&#xff0c;并且我经常观察到测试…

浅析C++的三大循环-以100以内的质数求解为例

简介 C三大循环分别是while、do while循环和for循环&#xff0c;其中for循环最为灵活&#xff0c;do while循环和while循环基本一致。 语法格式 //while语法 while(循环控制条件) { 语句 } //do while语法 do { } while(循环控制条件); //for循环 for(变量初始化;循环控制条…

如何找到CSDN的草稿

如何找到CSDN的草稿 Ps&#xff1a;CSDN的草稿箱有点难找

W10关闭不必要的服务

1 win10关不必要的服务 简单粗暴且有效 2 win10电脑如何关闭不必要的启动项 关闭不必要的启动项 3 有关服务方面 没有试验过&#xff0c;以后有空试验一下

pat 乙级 1004 成绩排名(C++)

题目 读入 n&#xff08;>0&#xff09;名学生的姓名、学号、成绩&#xff0c;分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;格式为 第 1 行&#xff1a;正整数 n 第 2 行&#xff1a;第 1 个学生的姓名…

java8 函数式编程_您必须学习Java 8的函数式编程吗?

java8 函数式编程我最近一直在研究Java 8&#xff0c;并掌握了Manning出版的“ Java 8 In Action” 。 让我印象深刻的第一件事是Java 8独特的销售主张是函数式编程。 函数现在是一流的变量&#xff0c;您可以像int或String一样在代码中传递它们。 这是一个很大的变化。 近年来…

Dell笔记本双系统安装(Ubuntu 16.04)

一 参考博客 重点 以上博客在分盘问题中描写不详细&#xff0c;参考右边博客&#xff1a; 有关分盘问题 注意&#xff1a;其中&#xff0c;由于Bios Dell与其余电脑存在区别&#xff0c; 1. 开机按F12&#xff0c;进入BIOS 2.在 BIOS 的Boot菜单下&#xff0c;将Secure Bo…

pat 乙级 1006 换个格式输出整数(C++)

题目 让我们用字母 B 来表示“百”、字母 S 表示“十”&#xff0c;用 12…n 来表示不为零的个位数字 n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过 3位的正整数。 例如 234 应该被输出为 BBSSS1234&#xff0c;因为它有 2 个“百”、3 个“十”、以…

Stomp-Spring服务器端的Web套接字Java客户端

问题&#xff1a; 为了分析问题&#xff0c;我不得不编写一个简单的Java Web套接字客户端站点代码&#xff0c;并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序。 解决方案&#xff1a; pom.xml <?xml version"1.0" encoding"UTF-8&qu…

W10更新时间

https://jingyan.baidu.com/article/0aa2237561921088cc0d64f6.html