Heroku java

7,788 views

Published on

Heroku上でJavaアプリケーションを動かすためのチュートリアル。
Spring Rooを使ったSpring MVCのサンプルもあり。データストアとして、PostgreSQL、Database.comにも対応

Published in: Technology, News & Politics
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,788
On SlideShare
0
From Embeds
0
Number of Embeds
1,916
Actions
Shares
0
Downloads
41
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Heroku java

  1. 1. Kazuyuki Kawamura日本Springユーザグループ
  2. 2. www.heroku.com
  3. 3. 今日はJavaユーザ会のCCC
  4. 4. Cloud Application Platform
  5. 5.   herokuの新しいスタック  サポートする言語とフレームワーク   Ruby   Java   Rails 3   Spring   Sinatra   Play!   Node.js   Python   express   Django   Clojure   Scala   Ring
  6. 6.   スタックのソフトウェアバージョン   OS: Ubuntu Server 10.04   Ruby: MRI 1.9.2   Bundler: 1.1pre   Node.js: 0.4.7   NPM: 1.0.6   JVM: OpenJDK 6
  7. 7.   前提条件 (ローカルマシン)   JDKとMavenがインストールされている   gitがインストールされている http://code.google.com/p/git-osx-installer/downloads/list?can=3   herokuのコマンドラインクライアントがインストー ルされている (バージョン 2.1.0以上) gem install heroku
  8. 8.   アプリケーションを書く  pom.xmlに依存するライブラリを定義  ローカルでテスト  herokuへデプロイ
  9. 9. public  class  HelloWorld  extends  HttpServlet  {          @Override          protected  void  doGet(HttpServletRequest  req,  HttpServletResponse  resp)                          throws  ServletException,  IOException  {                  resp.getWriter().print("Hello  from  Java!n");          }          public  static  void  main(String[]  args)  throws  Exception{                  Server  server  =  new  Server(Integer.valueOf(System.getenv("PORT")));                  ServletContextHandler  context  =                            new  ServletContextHandler(ServletContextHandler.SESSIONS);                  context.setContextPath("/");                  server.setHandler(context);                  context.addServlet(new  ServletHolder(new  HelloWorld()),"/*");                  server.start();                  server.join();                }  }
  10. 10. <?xml  version="1.0"  encoding="UTF-­‐8"?>      <dependencies>  <project  xmlns="http://maven.apache.org/ POM/4.0.0"  xmlns:xsi="http://www.w3.org/ <!-­‐-­‐  Jetty  -­‐-­‐>   2001/XMLSchema-­‐instance"          <dependency>   xsi:schemaLocation="http://            <groupId>   maven.apache.org/POM/4.0.0  http://                org.eclipse.jetty   maven.apache.org/maven-­‐v4_0_0.xsd">              </groupId>              <artifactId>      <modelVersion>4.0.0</modelVersion>                  jetty-­‐webapp      <groupId>foo</groupId>              </artifactId>      <version>1.0-­‐SNAPSHOT</version>              <version>${jetty.version}</version>      <name>helloheroku</name>          </dependency>      <artifactId>helloheroku</artifactId>          <dependency>              <groupId>org.mortbay.jetty</groupId>      <packaging>jar</packaging>              <artifactId>                  jsp-­‐2.1-­‐glassfish   <properties>              </artifactId>          <java.version>1.6</java.version>              <version>2.1.v20100127</version>          <jetty.version>          </dependency>      </dependencies>              7.4.4.v20110707          </jetty.version>      </properties>  
  11. 11.    <build>                    <programs>          <plugins>                          <program>              <plugin>                              <mainClass>                  <groupId>                                  HelloWorld                      org.apache.maven.plugins</groupId>                              </mainClass>                  <artifactId>maven-­‐compiler-­‐plugin                              <name>webapp</name>                          </program>                      </artifactId>                      <programs>                  <version>2.3.2</version>                  </configuration>                  <configuration>                  <executions>                      <source>${java.version}</source>                      <execution>                      <target>${java.version}</target>                          <phase>package</phase>                  </configuration>                          <goals>              </plugin>                              <goal>assemble</goal>              <plugin>                          </goals>                  <groupId>org.codehaus.mojo</groupId>                      </execution>                  </executions>                  <artifactId>appassembler-­‐maven-­‐plugin              </plugin>                      </artifactId>          </plugins>                  <version>1.1.1</version>      </build>                  <configuration>   </project>                      <assembleDirectory>target                          </assembleDirectory> <generateRepository>false                          </generateRepository>  
  12. 12.   プロセスモデル   Procfileとherokuのプロセス管理コマンド  Procfile   heroku上のwebまたはworker dynoで実行されるコ マンドを定義 web: sh target/bin/webapp  ローカルで実行   mvn install   export REPO=$HOME/.m2/repository prereq:   foreman start gem install foreman 12:20:54 web.1 | 2011-10-17 12:20:54.047:INFO::jetty-7.4.4.v20110707 12:20:54 web.1 | 2011-10-17 12:20:54.153:INFO::started o.e.j.s.ServletContextHandler{/,null} 12:20:54 web.1 | 2011-10-17 12:20:54.192:INFO::Started SelectChannelConnector@0.0.0.0:5000 STARTING
  13. 13.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”
  14. 14.   herokuへデプロイ   cedar stack上にアプリケーションを作成 heroku create --stack cedar Enter your Heroku credentials. Email: kaz.kawamura@gmail.com Password: Creating quiet-lightning-477... done, stack is cedar http://quiet-lightning-477.herokuapp.com/ | git@heroku.com:quiet-lightning-477.git Git remote heroku added
  15. 15.   herokuへデプロイ   コードのデプロイ git push heroku master Counting objects: 6, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 629 bytes, done. Total 6 (delta 0), reused 0 (delta 0) -----> Heroku receiving push -----> Node.js app detected -----> Vendoring node 0.4.7 -----> Installing dependencies with npm 1.0.8 express@2.2.0 ./node_modules/express ├── mime@1.2.2 ├── connect@1.6.0 └── qs@0.2.0 Dependencies installed -----> Discovering process types Procfile declares types -> web -----> Compiled slug size is 3.2MB -----> Launching... done, v4 http://quiet-lightning-477.herokuapp.com deployed to Heroku To git@heroku.com:quiet-lightning-477.git * [new branch] master -> master
  16. 16.   heroku プロセス管理コマンド   プロセスの実行数を変更 heroku ps:scale web=1 Scaling web processes... done, now running 1   プロセスのステータスを確認 heroku ps Process State Command ------------ ------------------ ------------------------------ web.1 idle for 158h sh target/bin/webapp   ログを確認 heroku logs 2011-07-18T05:33:23+00:00 app[web.1]: Listening on 13725 2011-07-18T05:33:42+00:00 heroku[web.1]: State changed from starting to up
  17. 17.   サンプルプログラム   Rooを利用して作成   DBにデータを格納するSpring MVCを利用したWeb アプリケーション   Pizza Shop http://www.springsource.org/roo/guide?w=beginning  作成したサンプルをHerokuで実行するように 変更
  18. 18. project --topLevelPackage com.sample.pizzashop  Mavenを利用してビルド  AspectJを利用している
  19. 19. persistence setup --provider HIBERNATE -- database HYPERSONIC_IN_MEMORY  JPAの初期設定   persistence.xmlやSpringの設定などを追加
  20. 20.   作成するエンティティ   Topping – トッピング   Base – 生地   Pizza – ピザ   PizzaOrder – ピザの注文entity --class ~.domain.Topping --testAutomaticallyfield string --fieldName name --notNull --sizeMin 2entity --class ~.domain.Base --testAutomaticallyfieldstring --fieldName name --notNull --sizeMin 2
  21. 21. entity --class ~.domain.Pizza –testAutomaticallyfield string --fieldName name --notNull --sizeMin 2field number --fieldName price --type java.lang.Floatfieldset --fieldName toppings --type ~.domain.Toppingfield reference --fieldName base --type ~.domain.Base
  22. 22. entity --class ~.domain.PizzaOrder -- testAutomaticallyfieldstring --fieldName name --notNull --sizeMin 2field string --fieldName address --sizeMax 30field number --fieldName total --type java.lang.Floatfield date --fieldName deliveryDate --type java.util.Datefield set --fieldName pizzas --type ~.domain.Pizza
  23. 23. web mvc setupweb mvc all --package ~.web
  24. 24. perform tests  テストの実行perform eclipse  Eclipse関連のファイルの作成
  25. 25.   ひとまず実行 mvn jetty:run http://localhost:8080/pizzashop へアクセス
  26. 26.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”   herokuにデプロイ git push heroku master
  27. 27.   Herokuが提供するデータベースはPostgreSQL   Shared Databaseは5MBまで無償で利用可能   有料オプションもあり  DATABASE_URL環境変数にDBへの接続情報 が格納されている
  28. 28.   データベース関連の設定   DBとしてPostgreSQLを利用するように設定 以下をRooで実行 persistence setup --provider HIBERNATE --database POSTGRES   Spring設定ファイル(src/main/resources/META- INF/spring/applicationContext.xml)の編集 <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value="#{systemEnvironment[DATABASE_URL].replaceAll( postgres://(.*):(.*)@(.*), jdbc:postgresql://$3?user=$1&amp;password=$2) }"/> </bean> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="persistenceUnit"/> <property name="dataSource" ref="dataSource"/> </bean>
  29. 29.   データベース関連の設定   persistence.xml(src/main/resources/META-INF/ persistence.xml)の編集 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <persistence …⋯> <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.datanucleus.jpa.PersistenceProviderImpl</provider> <properties> <property name="datanucleus.autoCreateSchema" value="false"/> <property name="datanucleus.storeManagerType" value="rdbms"/> <property name="datanucleus.ConnectionURL” value="jdbc:postgresql://localhost:5432"/> <property name="datanucleus.ConnectionUserName" value=""/> <property name="datanucleus.ConnectionPassword" value=""/> <property name="datanucleus.autoCreateTables" value="true"/> …⋯ </properties> </persistence-unit> </persistence>
  30. 30.   起動用のjettyの追加 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.5.1.v20110908</version> <destFileName>jetty-runner.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>
  31. 31.   サービス起動用の設定 Procfileを作成 web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war  ローカルで起動   環境変数DATABASE_URLを設定 export DATABASE_URL=postgres://demo:demo@localhost/demo   サービスを起動 foreman start → http://locahost:5000/
  32. 32.   herokuへデプロイ   gitにアプリケーションを格納 git add . git commit –m “Support PostgreSQL”   herokuにデプロイ git push heroku master
  33. 33.   www.database.com  native cloud database service   RESTやSOAPのAPIを通してデータにアクセス   OAuth、SAMLを用いて認証
  34. 34.   http://forcedotcom.github.com/java-sdk/  Javaアプリケーションからdatabase.comにアク セスするためのモジュール   API Connector   JPA Provider (datanucleusベース)   Oauthによる認証/認可   Spring Securityプラグイン   自動コード生成モジュール (既存のオブジェクトか らEntityを自動生成)
  35. 35.   データベース関連の設定   JPAプロバイダとしてDatanucleusを利用するように 設定 (databaseは何でも良い) 以下をRooで実行 persistence setup --provider DATANUCLEUS_2 --database POSTGRES
  36. 36.   pom.xmlを変更   database.com SDKをdependencyに追加 <dependency> <groupId>com.force.sdk</groupId> <artifactId>force-jpa</artifactId> <version>22.0.7-BETA</version> </dependency>   datanucleusのバージョンの変更 <dependency> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-core</artifactId> プラグインの <version>2.2.3</version> dependency </dependency> <dependency> も要変更 <groupId>org.datanucleus</groupId> <artifactId>datanucleus-jpa</artifactId> <version>2.1.7</version> </dependency>
  37. 37.   persistence.xml(src/main/resources/META- INF/persistence.xml)の変更 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" …⋯> <persistence-unit name="forceDatabase"> <provider>com.force.sdk.jpa.PersistenceProviderImpl</provider> <properties> <property name="datanucleus.autoCreateSchema" value="true" /> <property name="datanucleus.storeManagerType" value="force" /> <property name="datanucleus.validateTables" value="false" /> <property name="datanucleus.validateConstraints" value="false" /> <property name="datanucleus.Optimistic" value="false" /> <property name="datanucleus.datastoreTransactionDelayOperations" value="true"/> <property name="datanucleus.jpa.addClassTransformer" value="false" /> <property name="datanucleus.cache.level2.type" value="none" /> <property name="datanucleus.detachAllOnCommit" value="true" /> <property name="datanucleus.copyOnAttach" value="false" /> </properties> </persistence-unit> </persistence>
  38. 38.   Spring設定ファイル(src/main/resources/ META-INF/spring/applicationContext.xml)の 変更 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="forceDatabase" /> </bean> <bean id="forceService" class="com.force.sdk.connector.ForceServiceConnector"> <property name="connectionName" value="forceDatabase"/> </bean>
  39. 39.   Entityの変更   Database.comの制限   IDはStringでなければいけない @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private String Base.id; Base_Roo_Entity.aj   VersionフィールドはlastModifiedDateにマッピング @Version @Column(name = "lastModifiedDate") @Temporal(TemporalType.TIMESTAMP) private Calendar Base.version; Base_Roo_Entity.aj
  40. 40.   Entityの変更   Database.comの制限   ManyToManyは未サポート   要件に合わせて、OneToMany、ManyToOneに変更する   中間テーブル用のEntityを作成する   上記変更に合わせ、以下も修正   テストクラス   Webのコントローラクラス
  41. 41.   環境変数の設定   database.comのコネクタは、FORCE_<コネクション 名>_URL環境変数で指定された接続先に接続   コネクション名は、JPAであればpersistence-unitの名前 export FORCE_FORCEDATABASE_URL="force:// login.salesforce.com? user=xxx@sample.com&password=passwd"  ローカルで実行 mvn jetty:run
  42. 42.   環境変数の設定 heroku config:add FORCE_FORCEDATABASE_URL="force:// login.salesforce.com?user=xxx@sample.com&password=passwd"  デプロイ git add . git commit -m "Support Database.com" git push heroku master  ログを確認 heroku logs  Webブラウザでアプリケーションにアクセス heroku open
  43. 43.   addons.heroku.com
  44. 44.   Java on heroku   heroku上でJavaアプリケーションを動かすことがで きる   gitを利用してデプロイ   Mavenを利用してビルド   Java EEではない  データソース   herokuで提供されるDBはPostgreSQL   database.comなど外部のツールとも連携可能   herokuのAdd-onによって様々なデータソースが利 用可能

×