论坛首页 Java企业应用论坛

如何在heroku上部署一个java web 程序

浏览 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

  
   发表时间:2012-09-05  
太麻烦了,有这时间都可以学完rails,然后再部署上heroku了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics