heroku使用笔记
这两天将一个项目转到了heroku上面,哎呀我的个神,真心不好用:
Java:
https://devcenter.heroku.com/articles/java-support
默认不支持mysql而是支持protress,但是可用addon--cleardb来集成mysql,cleardb也有免费的级别。
但是即使是免费级别,必须要通过身份验证,也就是验证你的信用卡,否则无法添加addon。
http://www.ibm.com/developerworks/cn/java/j-javadev2-21/
maven不是必需的,可以直接发布war包 https://devcenter.heroku.com/articles/war-deployment
eclipse插件安装:
https://devcenter.heroku.com/articles/getting-started-with-heroku-eclipse
这个安装总是报错,尝试几次才成功,要看人品了。有了这个才差不多,否则那个控制台工具真不好用。
不存在永久的文件系统
https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem
http://stackoverflow.com/questions/12123050/no-permanent-filesystem-for-heroku
只能两个可写文件夹https://devcenter.heroku.com/articles/read-only-filesystem
./tmp ./log
servletContext.getRealPath();返回null问题,这是因为使用的webrunner跑的是未展开的war包。
解决办法是:
pom里面配置为展开war文件夹:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <executions> <execution> <phase>package</phase> <goals><goal>exploded</goal></goals> <configuration> <webappDirectory>${build.directory}/webapp</webappDirectory> </configuration> </execution> </executions> </plugin>
然后在Procfile里面指定webruner的目标(procfile是heroku添加参数的方法):
web: java $JAVA_OPTS -Dspring.profiles.active=prod -Dmidware.path.conf="distributed" -jar target/dependency/webapp-runner.jar --port $PORT target/webapp
这其实就是配置webrunner跑文件夹。
注:procfile的注释也是#号。
这样就可以得到webapp运行目录了,而且,此目录下的文件也是可写的!
但是要注意保持这个概念,都是临时性的文件系统,你用的时候要考虑这一点。
这里面讲了大部分问题:
https://devcenter.heroku.com/articles/java-faq
是直接发布war包还是用maven+嵌入的容器?
后者更容易发布,修改代码后直接构建测试,和heroku环境更接近。
而且源码方式更容易改配置,对于开发来说,每次改一个文件要传半天是很麻烦的。
项目目录下有个Procfile文件,heroku会依据其来启动,你可以修改它来添加系统参数。
https://devcenter.heroku.com/articles/procfile#deploying-to-heroku
本地运行可参见项目下的readme.md
例如:$java -jar target/dependency/webapp-runner.jar target/*.war
这个使用的jsimone项目,可在eclipse里面调试:
https://github.com/jsimone/webapp-runner
添加引用:
<dependency> <groupId>com.github.jsimone</groupId> <artifactId>webapp-runner</artifactId> <version>7.0.34.1</version> <scope>provided</scope> </dependency>
运行配置:
Right-click on your project and choose 'Debug As -> Debug Configurations...'
From the 'Debug Configuration' window create a new 'Java Application' launch configuration by double-clicking on 'Java Application' in the left hand list or right-clicking on it and selecting 'New' 类型为java工程
Give your launch configuration a sensible name. Then enter the name of your project in the 'Project' box
Enter 'webapp.runner.launch.Main' in the 'Main Class' box 启动类为webapp.runner.launch.Main;--path /abc --port 10080 (--path是指context)
java -jar target/dependency/webapp-runner.jar --help 参见所有参数
Click on the 'Arguments' tab and enter './src/main/webapp' in the 'Program Arguments' box 添加程序参数./src/main/webapp
Click 'Apply' and then 'Run'
需要注意的几点:
1:tomcat7较高版本有自带的servletapi依赖,如果你配置了自己的servletapi则可能造成冲突,例如报错:
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig
说明你配置的servletapi版本太低。这就需要将你配置的servletapi去掉而依赖jsimone的包。在打包时这个不应该包含在包中,因为实际环境的容器都应该有自己的servlet包。
由于是分布式结构,不存在任何共享数据(数据库,memcache这些是另外的概念除外),所以实例之间的线程是互不可见的。
mysql:cleardb:
怎样查看信息,远程连接:
http://stackoverflow.com/questions/9822313/remote-connect-to-cleardb-heroku-database
运行heroku config --app 你app的名字就可看到信息。
通过此信息可以远程连接,例如heidisql可直接连,但是官方推荐的是用ssl连接:
https://devcenter.heroku.com/articles/cleardb#using-ssl-with-cleardb-and-rails
默认的cleardb信息是在环境变量里的,可以依据此变量来,
https://devcenter.heroku.com/articles/cleardb#using-cleardb-in-a-play-framework-app
当然你可以copy出变量信息直接用在程序中。
这里吐槽一下,那个自带的工具真是垃圾,不能粘贴,不能复制,有时还显示错行,powercommand里面怎么也运行不正确,所以还是eclipse插件靠谱。
例如查看程序信息,可得到cleardb的参数:
可导入已存在项目,也可以创建项目,提交到git上后heroku会自动重启。
可直接通过console查看日志,很方便。
再来吐槽一下它的客服:
慢!问了个问题24小时之后才得到回复,而且由于是java相关问题,他又转到了编程人员,这样第三天才得到回复。
它的GIT经常访问不了,理由你懂得. http://ruby-china.org/topics/10813