Your SlideShare is downloading. ×
Heroku java
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Heroku java

6,747
views

Published on

Heroku上でJavaアプリケーションを動かすためのチュートリアル。 …

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
6,747
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
37
Comments
0
Likes
10
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Kazuyuki Kawamura日本Springユーザグループ
  • 2. www.heroku.com
  • 3. 今日はJavaユーザ会のCCC
  • 4. Cloud Application Platform
  • 5.   herokuの新しいスタック  サポートする言語とフレームワーク   Ruby   Java   Rails 3   Spring   Sinatra   Play!   Node.js   Python   express   Django   Clojure   Scala   Ring
  • 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.   前提条件 (ローカルマシン)   JDKとMavenがインストールされている   gitがインストールされている http://code.google.com/p/git-osx-installer/downloads/list?can=3   herokuのコマンドラインクライアントがインストー ルされている (バージョン 2.1.0以上) gem install heroku
  • 8.   アプリケーションを書く  pom.xmlに依存するライブラリを定義  ローカルでテスト  herokuへデプロイ
  • 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. <?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.    <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.   プロセスモデル   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.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”
  • 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.   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.   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.   サンプルプログラム   Rooを利用して作成   DBにデータを格納するSpring MVCを利用したWeb アプリケーション   Pizza Shop http://www.springsource.org/roo/guide?w=beginning  作成したサンプルをHerokuで実行するように 変更
  • 18. project --topLevelPackage com.sample.pizzashop  Mavenを利用してビルド  AspectJを利用している
  • 19. persistence setup --provider HIBERNATE -- database HYPERSONIC_IN_MEMORY  JPAの初期設定   persistence.xmlやSpringの設定などを追加
  • 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. 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. 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. web mvc setupweb mvc all --package ~.web
  • 24. perform tests  テストの実行perform eclipse  Eclipse関連のファイルの作成
  • 25.   ひとまず実行 mvn jetty:run http://localhost:8080/pizzashop へアクセス
  • 26.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”   herokuにデプロイ git push heroku master
  • 27.   Herokuが提供するデータベースはPostgreSQL   Shared Databaseは5MBまで無償で利用可能   有料オプションもあり  DATABASE_URL環境変数にDBへの接続情報 が格納されている
  • 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.   データベース関連の設定   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.   起動用の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.   サービス起動用の設定 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.   herokuへデプロイ   gitにアプリケーションを格納 git add . git commit –m “Support PostgreSQL”   herokuにデプロイ git push heroku master
  • 33.   www.database.com  native cloud database service   RESTやSOAPのAPIを通してデータにアクセス   OAuth、SAMLを用いて認証
  • 34.   http://forcedotcom.github.com/java-sdk/  Javaアプリケーションからdatabase.comにアク セスするためのモジュール   API Connector   JPA Provider (datanucleusベース)   Oauthによる認証/認可   Spring Securityプラグイン   自動コード生成モジュール (既存のオブジェクトか らEntityを自動生成)
  • 35.   データベース関連の設定   JPAプロバイダとしてDatanucleusを利用するように 設定 (databaseは何でも良い) 以下をRooで実行 persistence setup --provider DATANUCLEUS_2 --database POSTGRES
  • 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.   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.   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.   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.   Entityの変更   Database.comの制限   ManyToManyは未サポート   要件に合わせて、OneToMany、ManyToOneに変更する   中間テーブル用のEntityを作成する   上記変更に合わせ、以下も修正   テストクラス   Webのコントローラクラス
  • 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.   環境変数の設定 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.   addons.heroku.com
  • 44.   Java on heroku   heroku上でJavaアプリケーションを動かすことがで きる   gitを利用してデプロイ   Mavenを利用してビルド   Java EEではない  データソース   herokuで提供されるDBはPostgreSQL   database.comなど外部のツールとも連携可能   herokuのAdd-onによって様々なデータソースが利 用可能

×