一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导

tomee_BigCat_s

警告:我不是Spring Boot的专家。 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作。 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人。 但是我认为社区高估了该产品。

一年前,我开始收到很多有关博客文章,推文和有关Spring Boot信息的链接。 在他的网站上,您可以阅读:

通过Spring Boot,可以轻松地创建独立的,生产级的基于Spring的应用程序,您可以“运行”它们。

看来这件事已经彻底改变了Java世界。

例如,Spring Boot中的Spring MVC(以及RESTful)应用程序如下所示:

@Controller
@EnableAutoConfiguration
public class SampleController {@RequestMapping("/")@ResponseBodyString home() {return "Hello World!";}public static void main(String[] args) throws Exception {SpringApplication.run(SampleController.class, args);}
}

如您所见,魔术发生在SpringApplication类内部,该类启动了嵌入式Tomcat或Jetty,并使用Spring东西注册了该控制器。 我知道令人印象深刻的几行内容就是您可以准备使用端点。

但是我不知道自己是否可以在JavaEE世界中使用相同的方法,并且具有相同的底层和轻量级需求。 答案是绝对的。 我刚刚创建了一个非常小的原型/概念验证来证明这是可能的。

另外,请不要误会我的意思,除了自包含的应用程序(例如监视,执行器或工件依赖项解析)以外,Spring Boot还提供了更多其他功能。 但是这些东西仅仅是与其他技术的集成,我的示例是在1小时半的时间内从零开始开发的,因此不要指望可以使用Spring Boot。

首先要选择的是要使用的应用程序服务器,在这种情况下,毫无疑问,此任务的最佳选择是Apache TomEE。 它是经过认证的Web配置文件Java EE服务器,需要1秒钟启动时间,并且可以使用默认的Java内存参数。

因此,我在pom.xml文件中添加了tomee依赖项。

<dependencies><dependency><groupId>org.apache.openejb</groupId><artifactId>tomee-embedded</artifactId><version>1.7.1</version></dependency><dependency><groupId>org.apache.openejb</groupId><artifactId>openejb-cxf-rs</artifactId><version>4.7.1</version></dependency><dependency><groupId>org.apache.openejb</groupId><artifactId>tomee-jaxrs</artifactId><version>1.7.1</version></dependency><dependency><groupId>org.jboss.shrinkwrap</groupId><artifactId>shrinkwrap-depchain</artifactId><version>1.2.2</version><type>pom</type></dependency></dependencies>

在以前的嵌入式版本(1.7.1)中,您只能部署文件中包含的应用程序,不能像在Tomcat中一样以编程方式添加Servlet。 嵌入式tomee API在不久的将来可能会改变,但是现在,我们将使用ShrinkWrap以编程方式创建这些部署文件。

这是我们想要做的:

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;@Stateless
@Path("/sample")
public class SampleController {@GET@Produces("text/plain")public String sample() {return "Hello World";}public static void main(String args[]) {TomEEApplication.run(HelloWorldServlet.class, SampleController.class);}
}

请注意,我们仅导入JavaEE类,其数量与Spring Boot一号相比减少了。 在短短2秒钟内即可使用该应用程序。 请记住,您可以使用Web配置文件规范以及JAX-RS或JMS提供的任何功能。 因此,例如,您可以使用JPA,Bean验证,EJB,CDI等。

而且TomEEApplication里面有什么? 只有70行的课程会让您惊讶:

public class TomEEApplication {private static void startAndDeploy(Archive> archive) {Container container;try {Configuration configuration = new Configuration();String tomeeDir = Files.createTempDirectory("apache-tomee").toFile().getAbsolutePath();configuration.setDir(tomeeDir);configuration.setHttpPort(8080);container = new Container();container.setup(configuration);final File app = new File(Files.createTempDirectory("app").toFile().getAbsolutePath());app.deleteOnExit();File target = new File(app, "app.war");archive.as(ZipExporter.class).exportTo(target, true);container.start();container.deploy("app", target);container.await();} catch (Exception e) {throw new IllegalArgumentException(e);}registerShutdownHook(container);}private static void registerShutdownHook(final Container container) {Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {try {if(container != null) {container.stop();}} catch (final Exception e) {throw new IllegalArgumentException(e);}}});}public static void run(Class> ... clazzes) {run(ShrinkWrap.create(WebArchive.class).addClasses(clazzes));}public static void run(WebArchive archive) {startAndDeploy(archive);}
}

如您所见,这实际上是一段简单的代码,例如,对应用程序的配置或名称进行了硬编码,但请注意,只需进行几处简单的更改,就可以开始配置服务器,应用程序等。

总而言之,Spring Boot当然很酷,但是通过非常简单的步骤,您就可以在JavaEE世界中拥有相同的功能。 我们(Apache TomEE贡献者)将开始着手这一工作,并扩大这一想法。

因此,不要因为Spring Boot而低估Java EE。

翻译自: https://www.javacodegeeks.com/2014/09/one-jar-to-rule-them-all-apache-tomee-shrinkwrap-javaee-boot.html

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

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

相关文章

iview-admin框架运行步骤

第一步&#xff1a; 前往github下载整个iview-admin框架的全部源码 github地址&#xff1a; https://github.com/iview/iview-admin 第二步&#xff1a; 点击Clone or download绿色按钮。下载整个压缩包 第三步&#xff1a; 解压至D盘&#xff0c;在根目录中按 1、前往github下…

.net 垃圾回收学习[How To: Use CLR Profiler][翻译学习]【2】

http://msdn.microsoft.com/zh-cn/library/ms979205 注意&#xff1a;内容可能已经过期了。 注意&#xff1a;CLR Profiler最新版本&#xff1a;http://www.microsoft.com/download/en/details.aspx?id16273 Identifying Common Garbage Collection Issues 可以使用CLR Profil…

JavaOne 2014:会议与合同利益冲突

杜克街咖啡馆&#xff0c;工程师可以在街上进行走廊交谈 。 与签约不兼容 我的第11届JavaOne会议&#xff08;2004年至2014年为11 10 1&#xff09;非常出色。 值得参加此活动并结识社区中所有参与的人。 现在&#xff0c;这里是绅士的&#xff0c;但 。 除了经济上的明显优…

JQuery(三)-- AJAX的深入理解以及JQuery的使用

HTTP HTTP http: 超文本传输协议。特点&#xff1a; 简单、快速、灵活、无状态、无连接 URL&#xff1a; 统一资源定位符。 组成&#xff1a;协议名://主机IP&#xff1a;端口号/项目资源地址&#xff1f;传递参数的键值对#锚点 ①ip地址在同一个网段是唯一的。如果是在公…

JSF的工作方式和调试方式–可以使用polyglot吗?

JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架&#xff0c;尤其是在初次遇到时。 在这篇文章中&#xff0c;让我们继续探讨为什么会出现这种情况&#xff0c;并提供一些JSF调试技术。 我们将讨论以下主题&#xff1a; JSF不是我们经常想到的 JSF调试的难…

React组件实现越级传递属性

如果有这样一个结构&#xff1a;三级嵌套&#xff0c;分别是&#xff1a;一级父组件、二级子组件、三级孙子组件&#xff0c;且前者包含后者&#xff0c;结构如图&#xff1a; 如果把一个属性&#xff0c;比如color&#xff0c;从一级传递给三级&#xff0c;一般做法是使用prop…

尝试Office 2003 VSTO的开发、部署

背景&#xff1a;一年前&#xff0c;某项目需要使用到Excel进行数据录入&#xff0c;考虑到很多用户还是使用XPOffice 2003&#xff0c;所以开发的时候直接使用Excel 2003版本进行VBA开发。也许很多人都会说&#xff0c;Win10都出了&#xff0c;微软的Office都要免费了&#xf…

初级开发人员在编写单元测试时常犯的错误

自从我编写第一个单元测试以来已经有10年了。 从那时起&#xff0c;我不记得我已经编写了成千上万的单元测试。 老实说&#xff0c;我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中&#xff0c;我与多个开发团队合作…

OpenDaylight开发hello-world项目之开发工具安装

OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码框架搭建 在ODL开发之前&#xff0c;要安装好开发环境。ODL使用java语言开发&#xff0c;所以要安装好java。ODL的代码框架是有maven这个…

Google Chrome 扩展程序开发

根据公司的规定&#xff0c;每月八小时&#xff0c;弹性工作制。所以大家平时来的不太准时&#xff0c;如果有事&#xff0c;下班也就早些回去了。所以一个月下来工作时间可能不够&#xff0c;但是公司的考勤日历是这样的&#xff1a; 除了请假和法定节假日外&#xff0c;其他样…

[Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现

本文说说ViewModel的这个INotifyPropertyChanged接口可以用来做啥&#xff1f; 举例1&#xff1a;我有个TabControl&#xff0c;里面放了很多View&#xff0c;每个由ViewModel控制&#xff0c;我想是想TabSelectionChanged就打开相应的ViewModel&#xff0c;怎么做&#xff1f;…

[读书笔记]TCP/IP详解V1读书笔记-4 5

IP地址与以太网地址之间的关系 R P发送一份称作A R P请求的以太网数据帧给以太网上的每个主机。这个过程称作广播&#xff0c;在32 bit的I P地址和采用不同网络技术的硬件地址之间提供动态映射 ----------------------------------------- arp以太网帧的类型字段为x 0 8 0 6&am…

未来是Apache Karaf上的微服务架构

这是Jamie Goodyear的客座博客文章&#xff08; 博客 &#xff0c; icbts &#xff09;。 他是Savoir Technologies的开源倡导者&#xff0c;Apache开发人员和计算机系统分析师&#xff1b; 他为全球大型组织设计&#xff0c;批判和支持了体系结构。 他拥有纽芬兰纪念大学的计…

使用内存回流的方法来实现将image的内容转换为 byte[]

在今天的开发中老大不知道怎么突发奇想&#xff0c;要使用Image的Byte数据。当时使用老几种方式效果均不理想&#xff0c;最后发现其实可以使用内存回流的方式来实现。多的不说老&#xff0c;马上贴上代码&#xff1a;/**//// <summary> /// 将byte[]转换为Image…

通过设计国际象棋游戏来了解策略模式

今天&#xff0c;我们将借助一个示例来尝试了解策略模式。 我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式&#xff0c;而不是构建全面的国际象棋游戏解决方案。 策略模式&#xff1a;策略模式被称为行为模式-用于管理对象之间的算法&#xff0c;关系和职责。 策…

群发邮件

最近&#xff0c;通过两周的学习&#xff0c;对.net 的基础知识有了进一步的了解。觉得自己可以写个小程序了。于是花了两天时间写了一个 群发邮件的一个WinForm小程序。自己在这里小秀一下&#xff0c;表扬及鼓励一下自己。哈哈&#xff01; 此小程序在发送邮件的基础上还添加…

Npm install failed with “cannot run in wd”

Linux环境下&#xff0c;root账户&#xff0c;安装某些npm包的时候报下面的错误&#xff0c;例如安装grunt-contrib-imagemin时&#xff1a; Error: EACCES, mkdir /usr/local/lib/node_modules/coffee-scriptnpm ERR! { [Error: EACCES, mkdir /usr/local/lib/node_modules/c…

我的Google Adsense帐户被关

一、 上周四&#xff0c;我收到Google的邮件&#xff0c;宣布关闭我的Adsense帐户。 "您好&#xff01; 查看了相关记录后&#xff0c;我们确认您的 AdSense 帐户存在引起无效活动的风险。保护 AdWords 广告客户&#xff0c;使其免受无效活动的侵害是我们的责任&#xff0…

csharp: ODP.NET,System.Data.OracleClient(.net 4.0) and System.Data.OleDb读取Oracle g 11.2.0的区别...

ODP.NET: 引用&#xff1a; using Oracle.DataAccess; //Oracle g 11.2.0 using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; //下载 http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html //引用&#xff1a;D:\app\geovindu…

Java 9幕后花絮:新功能从何而来?

找出Java幕后发生的事情&#xff0c;以及新功能如何实现 在上一篇文章中&#xff0c;我们介绍了即将发布的Java 9版本的新功能和尚待解决的功能&#xff0c;并简要提到了将新功能添加到下一个版本之前要经历的过程。 由于此过程几乎影响了所有Java开发人员&#xff0c;但大多数…