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

java heroku

最近,我听说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

java heroku

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

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

相关文章

mysql 合服_风云私服合区的方法详解(mysql数据库合并)

只能合并帐号&#xff0c;MY的库不能合并。倒数据前请留好备份&#xff0c;防止发生以外&#xff0c;破坏你得数据&#xff0c;切忌.1)首先确认你的机器上必须装MySQL 以及 mysql-connector-odbc-5.1.1-win32.msimysql-connector-odbc-5.1.1-win32.msi 就是 MySQL ODBC 5.1,你可…

mysql自定义数据类型_MySQL中的数据类型

一.MySQL中的数值类型分类MySQL中数值类型主要有三类&#xff1a;数字类型&#xff0c;字符串类型&#xff0c;时间类型。1.数字类型1.1整数tinyint 1字节smallint 2字节mediumint 3字节int 4字节bigint …

分布式系统开发注意点_分布式系统开发注意事项

分布式系统开发注意点开发分布式软件系统时&#xff0c;要考虑许多因素。 如果您甚至不知道第一句话中我在说什么&#xff0c;那么让我为您提供一些见解&#xff0c;示例以及有关分布式系统的实例。 总览 分布式系统是指多个物理硬件设备与单独的离散用户交互并通过这些硬件设…

String#repeat来到Java吗?

JDK-8197594 &#xff08;“ String&#xff03;repeat”&#xff09;在其“描述”中包括以下内容&#xff1a;“长期以来&#xff0c;一直要求一种用于重复字符序列的String方法&#xff0c;没有后续操作。” 可以在JDK-8197594的“问题链接”中找到有关String类中用于重复字符…

mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?

一、什么是幻读在一次事务里面&#xff0c;多次查询之后&#xff0c;查询的结果集的个数不一致的情况叫做幻读。而多出来或者少的哪一行被叫做 幻行二、为什么要解决幻读在高并发数据库系统中&#xff0c;需要保证事务与事务之间的隔离性&#xff0c;还有事务本身的一致性。三、…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

mysql执行系统命令_mysql 命令行执行 sql

1.直接输入sql执行MySQL> select now();---------------------| now() |---------------------| 2013-09-18 13:55:45 |---------------------1 row in set (0.00 sec)2.执行编写好的sql脚本mysql> source /home/1.sql---------------------| now() |-------------------…

jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0

jboss7.1.1 部署前2个步骤实际上与Broadleaf无关&#xff0c;但是提到该步骤是为了使其易于执行&#xff08;复制/粘贴&#xff09;这些步骤。 步骤&#xff03;1&#xff1a;在JBoss AS中配置数据源。 <datasource jta"true" jndi-name"java:jboss/datasou…

java中n次方怎么表示_java如何计算一个数的n次方

java递归算法&#xff0c;代码如下&#xff1a;public class Test3 { public double zhishu(double x,double y){ if(y>0){ return x*zhishu(x,y-1); }else if(y<0){ return (x*zhishu(x,-y-1)); }else{ return 1; } } public double fuzhishu(…

枚举集合的EnumSet

在上一篇博客文章中&#xff0c;我们发现了EnumMap用于带有枚举键的映射。 您可能已经观察到&#xff0c;还有一个专门针对枚举优化的Set &#xff1a; EnumSet 。 我们再次定义一个CoffeeType枚举&#xff1a; public enum CoffeeType {ESPRESSO, POUR_OVER, FRENCH_PRESS, …

linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录

在操作文件目录时我们常常会考虑如下的功能&#xff1a;1、判断文件是否存在&#xff0c;并判断文件是否可写/目录是否存在Linux下&#xff1a;#includeint access(const char* pathname, int mode);参数介绍&#xff1a;返回值&#xff1a;成功0&#xff0c;失败-1pathname 是…

mac 连接hbase的图形化界面_MAC安装Hbase以及Hbase基本命令

安装Hbase1&#xff0e;官网下载安装包&#xff0c;我下载的是hbase-2.4.0-bin.tar.gz。2&#xff0e;解压&#xff1a;tar zxf hbase-2.4.0-bin.tar.gz3&#xff0e;安装JDK&#xff0c;并设置JAVA_HOME&#xff0c;通过vi ~/.bash_profile&#xff0c;设置环境变量export JAV…

ldap java_使用LDAP保护Java EE6中的Web应用程序

ldap java在上一篇文章中&#xff0c;我们解释了如何在通过传输层安全性&#xff08;TLS&#xff09;/安全套接字层&#xff08;SSL&#xff09;传输数据时保护数据。 现在让我们尝试了解如何为使用LDAP服务器进行身份验证的基于JEE 6的Web应用程序应用安全机制。 目的&#x…

mysql 一致性hash_一致性hash算法在分表分库中的应用

一致性hash算法结构图 分表分库结构图 可进行循环冗余存储&#xff0c;顺时针存储到下一个物理节点(非虚拟节点)package com.haiziwang.platform.kmcsms.route.algorithm;import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap;/*** 一致性Hash算法…

生产中的性能分析

生产中的性能分析 如果您在Java应用程序的性能方面遇到了一些严重问题&#xff0c;那么很可能您会知道线程分析的价值。 但是您知道应该使用哪个分析器吗&#xff1f; 探查器使用两种基本技术-采样和仪器。 采样分析器 采样探查器包括定期向JVM询问所有当前活动线程的当前执行…

mysql用com_MySQL 使用教程

关于 MySQLMySQL 是最流行的开源数据库。本文简明的讲解了 MySQL 如何下载安装到使用的整个过程。MySQL 支持多种特性&#xff1a;使用 C和 C编写&#xff0c;并使用了多种编译器进行测试&#xff0c;保证了源代码的可移植性。支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell…

c++ 一维数组长度_每天一点C / 一维数组和指针

哈喽&#xff0c;我是老吴&#xff0c;继续记录我的学习心得。每天一点系列是我对微习惯的践行。现在能做到每天一点 C&#xff0c;将来就会有更多的每天一点系列&#xff0c;没人规定嵌入式软件工程师就只能学习 C 语言和折腾 Linux&#xff0c;不要给自己设限。为什么是每天一…

设计模式 工厂方法_工厂设计模式–一种有效的方法

设计模式 工厂方法如您所知&#xff0c;“工厂方法模式”或俗称“工厂设计模式”是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是&#xff0c;在运行时&#xff0c;我们根据传递的参数获得类似类型的对象。 关于这种模式的文章很多&#xff0c;开发人员可以通过…

SMPP Java示例(客户端)

这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例&#xff0c;使用该客户端我们可以简单地提交以向单个移动用户发送消息&#xff0c;也可以一次将消息广播给多个移动用户。另外&#xff0c;我们将验证交货收据。 出于客户端的目的&#xff0c;我们…

mysql插入另一个表中数据_MySql中把一个表的数据插入到另一个表中的实现

1.如果2张表的字段一致&#xff0c;并且希望插入全部数据&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目标表 SELECT * FROM 来源表;insert into insertTest select * from insertTest2;2.如果只希望导入指定字段&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目…