最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序。 由于没有真正的软件构想,我决定尝试一下,仅将SOMETHING配置为可在Heroku上运行。

我对ReST有一些迷恋(我仍然想学习并练习),所以我决定我的第一个应用程序将是使用Jersey (JAX-RS实现)的简单问候世界。 因此,我在GitHub上启动了一个项目 ,并开始设置Heroku CLI。

设置Heroku CLI

Heroku现在很容易设置。 我记得什么时候需要Ruby env和我的第一个
与Ruby的接触并不是那么好(没有任何安装程序,所以全是手动的-而且我很懒),所以我当时放弃了Heroku。 但是现在安装它变得轻而易举–只需转到Heroku Toolbelt并为您的平台下载版本。 我现在已经在Linux Mint和Windows 7上都进行了设置,并且效果很好。

为Heroku设置项目

我的项目称为摘要 -应该是另一个票务管理系统。 但这暂时不相关。 最重要的是,为了让Heroku发现我们的应用程序是Java应用程序,必须存在pom.xml文件。 这是因为Heroku使用Maven 3来构建Java应用程序。

因此,要真正开始使用Heroku进行任何工作,您需要一个简单的pom.xml文件。 就我而言,我为应用程序添加了一个单独的模块,因此我的主pom如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.github.pbuda.recaps</groupId><artifactId>recaps</artifactId><packaging>pom</packaging><version>0.0.1-SNAPSHOT</version><inceptionYear>2012</inceptionYear><developers><developer><name>Piotr Buda</name><email>pibuda@gmail.com</email><timezone>+1</timezone></developer></developers><licenses><license><name>Apache License, version 2.0</name><url>http://www.apache.org/licenses/LICENSE-2.0.html</url></license></licenses><modules><module>webmodule</module></modules><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></pluginManagement></build></project>

然后是Web模块,仅用于拆分项目:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.github.pbuda.recaps</groupId><artifactId>recaps</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>webmodule</artifactId><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.4</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins></build><dependencies><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-server</artifactId><version>1.12</version></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-core</artifactId><version>1.12</version></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-grizzly2</artifactId><version>1.12</version></dependency></dependencies></project>

我运行我的示例项目的第一次尝试集中在设置Jersey。 在检查了文档之后,我决定使用Grizzly2 HTTP服务器是因为它非常容易设置。 我基本上已经将文档教程粘贴到Main类中。 有一些必要的区别,因为例如服务器的端口是由Heroku动态分配的。 因此,经过很少的更改后,生成的Main类如下所示:

/*** Copyright 2012 Piotr Buda** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.github.pbuda.recaps;import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import org.glassfish.grizzly.http.server.HttpServer;import javax.ws.rs.core.UriBuilder;
import java.io.IOException;
import java.net.URI;/*** Created by IntelliJ IDEA.* User: pbu* Date: 28.02.12* Time: 21:01* To change this template use File | Settings | File Templates.*/
public class Main {private static URI getBaseURI(String hostname, int port) {return UriBuilder.fromUri("http://0.0.0.0/").port(port).build();}protected static HttpServer startServer(URI uri) throws IOException {System.out.println("Starting grizzly...");ResourceConfig rc = new PackagesResourceConfig("com.github.pbuda.recaps");return GrizzlyServerFactory.createHttpServer(uri, rc);}public static void main(String[] args) throws IOException {URI uri = getBaseURI(System.getenv("HOSTNAME"), Integer.valueOf(System.getenv("PORT")));HttpServer httpServer = startServer(uri);System.out.println(String.format("Jersey app started with WADL available at "+ "%sapplication.wadl\nTry out %shelloworld\nHit enter to stop it...",uri, uri));while(true) {System.in.read();}}
}

这将启动服务器并向其中注册一些资源。

一些灰熊的把戏

首先,GrizzlyServerFactory.createHttpServer方法接受一个必须以女巫模式名称开头的URI,在本例中为http://。 然后,它必须指定主机名,首先,我在herokuapp.com上将其设置为应用程序名称。 这没有用,但是Heroku很好地告诉了我:日志中有一条通知,指出服务器应绑定到0.0.0.0,因此我将URI更改为http://0.0.0.0。

其次,Jersey示例等待按键以终止服务器。 不幸的是,Heroku打印了一条消息,然后以某种方式将该消息传递给应用程序,并且服务器被终止。 为了解决这个问题,我将System.in.read()包裹在一个无限的while循环中。

这当然不是最好的解决方案,但它确实起作用了,或者看起来如此。 几个小时后,我检查了应用程序的日志,他们说该应用程序从上到下运行。 因此,我决定从Grizzly切换到Jetty,但这与本文无关。

在将所有内容推送到Heroku之前,我还添加了一个Procfile:

web:    java -cp webmodule/target/classes:webmodule/target/dependency/* com.github.pbuda.recaps.Main

在推送到Heroku之后,该应用程序被构建并启动,并请求http://growing-dawn-9158.herokuapp.com/helloworld产生了一些输出(在本例中为简单的“消息”消息)。 做得好。

我犯的错误并从中吸取教训

首先,我忘了添加Maven Dependency插件,但是在推送到Heroku之前我解决了这个问题。 没有配置它,我就无法将依赖项添加到classpath中,从而导致ClassNotFound异常。 起初我并没有想到它是必需的,但是后来我看了一下Heroku示例并轻松修复了它。

其次,我不知道网络测功机超时。 成功部署后,我确定该应用程序正在运行,但是由于超时,日志显示该应用程序已关闭。 因为我不了解网络测功机超时的事实,所以我怀疑Grizzly只是以某种方式被打断了,所以我决定搬到Jetty。 但这也发生在Jetty的实现上,因此我开始进行挖掘并找到了相关信息。

摘要

我认为Heroku很棒。 它是免费的Java托管,虽然不受欢迎,但他们做到了,而且效果很好。 我曾经尝试过Google App Engine,但是体验并不是很好(请注意您已经有很长时间了),所以我决定给Heroku一个机会,因为设置应用程序实际上很简单,我想我坚持一会儿并使用该平台–查看所有这些插件

参考: Heroku和Java –从新手到初学者,我们的JCG合作伙伴 Piotr Buda的第1部分在Software Ramblings博客上。

翻译自: https://www.javacodegeeks.com/2013/05/heroku-and-java-from-newbie-to-beginner-part-1.html

Heroku和Java –从新手到初学者,第1部分相关推荐

  1. Heroku和Java –从新手到初学者,第2部分

    问题 所以过了几天,我可以回到我的Recaps小项目. 我从检查日志开始,发现了以下内容: 2012-03-04T01:52:51+00:00 heroku[web.1]: Idling 2012-0 ...

  2. java heroku_Heroku和Java –从新手到初学者,第1部分

    java heroku 最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序. 由于没有真正的软件构想,我决定尝试一下,仅配置SOMETHING以在Heroku上运行. 我对ReST有所 ...

  3. java heroku_Heroku和Java –从新手到初学者,第2部分

    java heroku 问题 所以过了几天,我可以回到我的Recaps小项目. 我从检查日志开始,发现了以下内容: 2012-03-04T01:52:51+00:00 heroku[web.1]: I ...

  4. Java开发新手经常遇到的一些问题

    Java开发新手经常遇到的一些问题 A:java.lang.UnsupportedClassVersionError: Bad version number in .class file 解答:导致此 ...

  5. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  6. c语言和java哪个有前途_C语言和Java哪个更适合初学者?

    目前,无论是从应用范围还是流行程度来看,C语言和Java都是当下最为火热的编程语言.想要零基础入门编程的学习者在一开始的学习中都会碰到这样的难题:C语言和Java哪个更适合初学者?的确,编程语言的选择 ...

  7. 深圳Java培训:Java行业新手如何适应工作?

    新手上路,注意避让!这Java行业新手上岗其实跟刚刚拿到驾驶证的新手一样,总要小心翼翼避免横冲直撞!那作为一个Java新手该如何尽快适应工作呢? 作为一个Java行业新手,在工作之前,首先要检查一下自 ...

  8. 给学习java web新手们的建议和推荐一些书籍

    经常有人问我新手应该看哪些书籍,怎么样才行学好J2EE.其实各人都各人的学习方法,一个人的不一定适合另一个人,我在这里就我的学习路径,给大家列举一下,希望能提供一些参考.(申明:这里我不谈首先学习什么 ...

  9. Java编程学习:初学者怎样学好Java

    零基础学生只要方法得当,完全可以掌握Java编程.这里也是我个人的学习经历下面总结出来的几点学习Java的方法,仅供大家参考. 1.理解Java思想 Java是一门面向对象编程语言.向对象编程是Jav ...

最新文章

  1. HDU1106字符串排序题
  2. 高级转录组分析和R语言数据可视化第十三期 (线上线下同时开课)
  3. Java基础05 实施接口
  4. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
  5. 通过python实现linux切换用户_Python实现在Linux系统下更改当前进程运行用户
  6. SAP ABAP 内表使用
  7. 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数...
  8. 【codevs1935】【BZOJ2879】美食节,网络流之动态加点
  9. android q桌面,Android Q带来全新桌面模式
  10. 亚马逊遭遇15万人联名抗议:AI刷脸可以,但卖给政府不OK
  11. Cisco Nexus-1000v授权
  12. vue 共用新增和修改验证分离
  13. C++命名空间和缺省参数的概念
  14. 架构实战篇(三)-Spring Boot架构搭建RESTful API案例
  15. php悲观锁怎么做,mysql悲观锁怎么实现?
  16. 自动驾驶 9-4: 改进的 EKF - 错误状态扩展卡尔曼滤波器 An Improved EKF - The Error State Extended Kalman Filter
  17. java applet介绍,Java Applet 介绍
  18. 使用cgo,由于内存释放导致内存无效,引起的http crash
  19. arch模型的思路_ARCH模型课件.ppt
  20. 高中数学之向量外积的运用

热门文章

  1. jdbc java_Java中使用JDBC
  2. Java 截取反斜杠--java使用split拆分特殊字符
  3. 并发工具类【线程安全相关的类】
  4. 反引号包裹反引号_五个金色反引号
  5. mycat和应用程序集成_企业应用程序集成简介
  6. 获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例
  7. javafx窗体程序_JavaFX真实世界应用程序:欧洲电视网广播联盟
  8. Java大数据处理的流行框架
  9. 将指标标签与MicroProfile Metrics 2.0结合使用
  10. 单元测试反模式,完整列表