浏览 9815 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-09-05
http://kaka2008.herokuapp.com/blog/how-to-deploy-a-java-web-app-on-heroku
注:此文发表在我的博客上 版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 Heroku是一个云平台,属于现在比较流行的PaaS,在其上面可以部署ror,node.js,Clojure,java,python和scala。在其官方的介绍中,共有四个好处:Forget Servers,Run Anything,See Everything,Trust & Manage。在去年更是挖到了ruby之父Matz过去当CAO,之后的进步还是有目共睹的。不才今年端午节假期里在heroku上部署了一个java博客,使用hibernate+spring,view层使用spring mvc。在部署过程中,遇到了不少的问题,差一点就放弃了,不过好在我的努力之下都一一解决了。 大概我是中文世界里,在heroku上部署java app的第一人吧,要不heroku官方文档上有明显的错误,也没有人发觉?在部署过程中,遇到的问题,在中文圈子里搜索也很少搜到答案的,大部分都是在stackoverflow中搜索到的。另外一个感慨,就是heroku的官方文档写的太烂了!按照它的文档来,你一定无法顺利进行下去的,部署如此,前一段的数据库迁移也是如此。问题是,它的文档中明明有这些东西,在step by step中,却不给你链接,只有你自己走不下去了,去google之后,发现这东西在其它一篇文章里。。 下面开始详细介绍如何部署一个使用spring的java web程序: 1、Getting Start on Heroku: https://devcenter.heroku.com/articles/quickstart 注册、安装工具、登录什么的就不再赘述,这个看官网就行。 2、Prerequisites:https://devcenter.heroku.com/articles/spring-mvc-hibernate Java、Maven、Git以及heroku client; Postgres数据库 3、接下来,你需要创建一个基于maven的Java web app,在创建过程中,你可能需要使用到eclipse的maven插件,恩,看这里:http://www.eclipse.org/m2e ,另外还可以在eclipse中找这个地址提供的plugin http://download.eclipse.org/technology/m2e/releases 在eclipse中安装了maven中,接下来就要创建一个java web项目了,如果碰巧你也在使用spring mvc,那么你可以参考一下这篇文章:http://limingnihao.iteye.com/blog/83040 4、连接数据库 Heroku提供了一种连接数据库的新的方式:将连接用的参数提供在环境变量中,然后在spring的配置文件中,获取这个环境变量,再去解析各部分:url,class,username,password。听上去很酷!可是就是这里,因为heroku官方文档的错误,差点使我前功尽弃! 在官方文档中,是这样写的 <property name="username" value="#{ @dbUrl.getUserInfo().split(':')[0] }"/> <property name="password" value="#{ @dbUrl.getUserInfo().split(':')[1] }"/> 可是dbUrl之前那个@符号根本就不需要,如果写上了,就会报一个“java.lang.IllegalStateException: Cannot handle (64) '@'”的错误,这个错误你在google里是搜不到中文的。Google里第一个结果是我在stackoverflow上提问的~ 将上面部分的@去掉之后,就可以了。这个问题我已经给heroku官方写信了,可是两个月过去了,这个错误还是依旧存在。 完整的配置如下: <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> <property name="driverClassName" value="${database.driverClassName}"/> <property name="url" value="#{ 'jdbc:postgresql://' + dbUrl.getHost() + dbUrl.getPath() }"/> <property name="username" value="#{ dbUrl.getUserInfo().split(':')[0] }"/> <property name="password" value="#{ dbUrl.getUserInfo().split(':')[1] }"/> 注:可以使用自己的DataSource。 然后,设置环境变量, export DATABASE_URL=postgres://scott:tiger@localhost/myapp 。 这里说明一下,测试的时候,需要设置这个环境变量。但是部署时,不需要设置,heroku会自动提供此环境变量,只需要配置好DataSource即可。 5、Maven Heroku上要求项目是基于maven的,我之前没有接触过maven,学习maven也花了一些的时间。在iteye上也有许多的文章是介绍maven的,大家可以搜一搜,这篇http://virusfu.iteye.com/blog/1405204 写的还不错,大家可以看看。这里,我想说两个我遇到的问题,一是如何将自己的包安装到本地,二是往heroku部署时,如何使用自己的包。 第一个问题,如何将自己的包安装到本地。因为我们在做项目的过程中,肯定会用到许多自己的包,在public repository中肯定没有这些包,那么在pom.xml中,如何去写呢?这时就需要将这些包安装到本地了,可以使用以下命令: mvn install:install-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] 当然你也可以将其安装在私服上,使用以下命令: mvn deploy:deploy-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id] 第二个问题,如果将这些包安装到本地,那么在本地可以使用,上传到heroku之后,heroku并没有安装这些包,在build或是package时肯定会有错误,这时,就应该在pom.xml中增加内容,以便在package时将这些本地的包增加到WEB-INF/lib下,在pom.xml中增加以下内容: <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>process-resources</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <copy todir="${basedir}/target/blog/WEB-INF/lib"> <fileset dir="${basedir}/lib" includes="**/*" /> </copy> </tasks> </configuration> </execution> </executions> </plugin> 使用ant将包直接复制到WEB-INF/lib下。其中的是相对路径,大家可根据自己项目路径进行修改。 另外,heroku使用jetty来运行java程序,可以在pom.xml中增加以下内容: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals><goal>copy</goal></goals> <configuration> <artifactItems> <artifactItem> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-runner</artifactId> <version>7.4.5.v20110725</version> <destFileName>jetty-runner.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> 6、本地运行程序 在项目的根文件下创建一个名为Procfile的文件,里面内容如下:web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war 增加此文件,提交到heroku上之后,heroku会自动的运行程序。 在本地运行时,可以先进入项目的根文件夹,然后复制这句话,如果前面的配置都正确,那这时就应该可以正常启动了。注,在本地启动时,要把其中的$PORT 修改为具体的数字。 7、上传到heroku Heroku使用git作为vcs,heroku和git紧密结合,提交到git之后,heroku会自动检索到更新,并且会重启服务器。 Git也不多说了,如果你还没有接触过,可以看看这篇文章,http://www.iteye.com/topic/687879。 在部署时,可以参考heroku的这篇文章:https://devcenter.heroku.com/articles/git 另外,在使用heroku的命令时,可以指定app name,在命令后增加 –app appname即可。 如果前面一切都没问题,到这里,一个应用程序就已经部署完成,可以访问了。 8、其它链接 既然heroku官方宣称See Everything,那么应该有一些相应的功能了。下面提供相关功能的链接。 日志功能:https://devcenter.heroku.com/articles/logging 包括如何写入日志,查看日志,日志格式化等。 进程功能:https://devcenter.heroku.com/articles/ps 包括查看进程,重启进程等。 数据库功能:https://devcenter.heroku.com/articles/database 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-09-05
太麻烦了,有这时间都可以学完rails,然后再部署上heroku了
|
|
返回顶楼 | |