SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
Kazuyuki Kawamura
日本Springユーザグループ
www.heroku.com
今日はJavaユーザ会のCCC
Cloud Application Platform
    herokuの新しいスタック
    サポートする言語とフレームワーク
         Ruby             Java
            Rails 3          Spring

            Sinatra          Play!

         Node.js          Python
            express          Django

         Clojure          Scala
            Ring
    スタックのソフトウェアバージョン
         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
Heroku java
Heroku java
    前提条件 (ローカルマシン)
         JDKとMavenがインストールされている
         gitがインストールされている
          http://code.google.com/p/git-osx-installer/downloads/list?can=3
         herokuのコマンドラインクライアントがインストー
          ルされている (バージョン 2.1.0以上)
          gem	 install	 heroku
    アプリケーションを書く
    pom.xmlに依存するライブラリを定義
    ローカルでテスト
    herokuへデプロイ
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();	
  	
  	
  	
  
	
  	
  	
  	
  }	
  
}
<?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>	
  
 	
  <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>	
  
    プロセスモデル
         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
    herokuへデプロイ
         .gitignoreを作成
          target

         gitにアプリケーションを格納
      

git	 init

      

git	 add	 .

      

git	 commit	 –m	 “init”
    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
    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
    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
Heroku java
Heroku java
    サンプルプログラム
         Rooを利用して作成
         DBにデータを格納するSpring MVCを利用したWeb
          アプリケーション
         Pizza Shop
          http://www.springsource.org/roo/guide?w=beginning
    作成したサンプルをHerokuで実行するように
     変更
project --topLevelPackage com.sample.pizzashop
  Mavenを利用してビルド

  AspectJを利用している
persistence setup --provider HIBERNATE --
   database HYPERSONIC_IN_MEMORY
  JPAの初期設定
      persistence.xmlやSpringの設定などを追加
    作成するエンティティ
         Topping – トッピング
         Base – 生地
         Pizza – ピザ
         PizzaOrder – ピザの注文


entity --class ~.domain.Topping --testAutomatically
field string --fieldName name --notNull --sizeMin 2

entity --class ~.domain.Base --testAutomaticallyfield
string --fieldName name --notNull --sizeMin 2
entity --class ~.domain.Pizza –testAutomatically
field string --fieldName name --notNull --sizeMin 2

field number --fieldName price --type java.lang.Floatfield
set --fieldName toppings --type ~.domain.Topping
field reference --fieldName base --type ~.domain.Base
entity --class ~.domain.PizzaOrder --
    testAutomaticallyfield
string --fieldName name --notNull --sizeMin 2
field string --fieldName address --sizeMax 30
field number --fieldName total --type java.lang.Float
field date --fieldName deliveryDate --type java.util.Date
field set --fieldName pizzas --type ~.domain.Pizza
web mvc setup
web mvc all --package ~.web
perform tests
  テストの実行



perform eclipse
  Eclipse関連のファイルの作成
    ひとまず実行
     mvn jetty:run
     http://localhost:8080/pizzashop へアクセス
    herokuへデプロイ
         .gitignoreを作成
          target

         gitにアプリケーションを格納
      

git	 init

      

git	 add	 .

      

git	 commit	 –m	 “init”

         herokuにデプロイ
      

git	 push	 heroku	 master
Heroku java
Heroku java
    Herokuが提供するデータベースはPostgreSQL
         Shared Databaseは5MBまで無償で利用可能
         有料オプションもあり




    DATABASE_URL環境変数にDBへの接続情報
     が格納されている
    データベース関連の設定
         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>
    データベース関連の設定
         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>
    起動用の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>
    サービス起動用の設定
     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/
    herokuへデプロイ
         gitにアプリケーションを格納
      

git	 add	 .

      

git	 commit	 –m	 “Support	 PostgreSQL”

         herokuにデプロイ
      

git	 push	 heroku	 master
Heroku java
    www.database.com
    native cloud database service
         RESTやSOAPのAPIを通してデータにアクセス
         OAuth、SAMLを用いて認証
    http://forcedotcom.github.com/java-sdk/
    Javaアプリケーションからdatabase.comにアク
     セスするためのモジュール
         API Connector
         JPA Provider (datanucleusベース)
         Oauthによる認証/認可
         Spring Securityプラグイン
         自動コード生成モジュール (既存のオブジェクトか
          らEntityを自動生成)
Heroku java
    データベース関連の設定
         JPAプロバイダとしてDatanucleusを利用するように
          設定 (databaseは何でも良い)
          以下をRooで実行
          persistence setup --provider DATANUCLEUS_2 --database
          POSTGRES
    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>
    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>
    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>
    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
    Entityの変更
         Database.comの制限
            ManyToManyは未サポート
               要件に合わせて、OneToMany、ManyToOneに変更する
               中間テーブル用のEntityを作成する
         上記変更に合わせ、以下も修正
            テストクラス
            Webのコントローラクラス
    環境変数の設定
         database.comのコネクタは、FORCE_<コネクション
          名>_URL環境変数で指定された接続先に接続
            コネクション名は、JPAであればpersistence-unitの名前
          export	 FORCE_FORCEDATABASE_URL="force://
          login.salesforce.com?
          user=xxx@sample.com&password=passwd"

    ローカルで実行
          mvn	 jetty:run
     環境変数の設定
 

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
Heroku java
    addons.heroku.com
    Java on heroku
         heroku上でJavaアプリケーションを動かすことがで
          きる
         gitを利用してデプロイ
         Mavenを利用してビルド
         Java EEではない
    データソース
         herokuで提供されるDBはPostgreSQL
         database.comなど外部のツールとも連携可能
         herokuのAdd-onによって様々なデータソースが利
          用可能

Weitere ähnliche Inhalte

Was ist angesagt?

Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Kei Yagi
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょKohki Nakashima
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugYuji Kubota
 
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~CubedKachi
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jsKei Yagi
 
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...佑介 九岡
 
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみよう
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみようrsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみよう
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみようKen Sawada
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
統合バックアップbaculaを使ってみよう(GUI編)
統合バックアップbaculaを使ってみよう(GUI編)統合バックアップbaculaを使ってみよう(GUI編)
統合バックアップbaculaを使ってみよう(GUI編)Ken Sawada
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5Tsukasa Sugiura
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
Spring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsugSpring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsugToshiaki Maki
 

Was ist angesagt? (20)

Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
Git (運用編)
Git (運用編)Git (運用編)
Git (運用編)
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjug
 
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...
2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつく...
 
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみよう
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみようrsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみよう
rsyncやシェルでバックアップするよりも簡単にOSSのBaculaでバックアップしてみよう
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
統合バックアップbaculaを使ってみよう(GUI編)
統合バックアップbaculaを使ってみよう(GUI編)統合バックアップbaculaを使ってみよう(GUI編)
統合バックアップbaculaを使ってみよう(GUI編)
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Spring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsugSpring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsug
 

Ähnlich wie Heroku java

どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷JavaToshiaki Maki
 
Java ee6 with scala
Java ee6 with scalaJava ee6 with scala
Java ee6 with scalaSatoshi Kubo
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発Hironao Sekine
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成Shinsuke Sugaya
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方Yuki Morishita
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929hiro345
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介Etsuji Nakai
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみたTakahiro Hidaka
 
Apache Geode で始める Spring Data Gemfire
Apache Geode で始めるSpring Data GemfireApache Geode で始めるSpring Data Gemfire
Apache Geode で始める Spring Data GemfireAkihiro Kitada
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイKazuhiro Hara
 
Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化Etsuji Nakai
 

Ähnlich wie Heroku java (20)

どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
Java ee6 with scala
Java ee6 with scalaJava ee6 with scala
Java ee6 with scala
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
fanscala1 3 sbt
fanscala1 3 sbtfanscala1 3 sbt
fanscala1 3 sbt
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Apache Geode で始める Spring Data Gemfire
Apache Geode で始めるSpring Data GemfireApache Geode で始めるSpring Data Gemfire
Apache Geode で始める Spring Data Gemfire
 
Playbay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイPlaybay Play 2.0 plugin イロハのイ
Playbay Play 2.0 plugin イロハのイ
 
Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化
 
Java 7
Java 7Java 7
Java 7
 

Kürzlich hochgeladen

20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 

Kürzlich hochgeladen (12)

2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 

Heroku java

  • 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
  • 9.   前提条件 (ローカルマシン)   JDKとMavenがインストールされている   gitがインストールされている http://code.google.com/p/git-osx-installer/downloads/list?can=3   herokuのコマンドラインクライアントがインストー ルされている (バージョン 2.1.0以上) gem install heroku
  • 10.   アプリケーションを書く   pom.xmlに依存するライブラリを定義   ローカルでテスト   herokuへデプロイ
  • 11. 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();                }   }
  • 12. <?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>  
  • 13.    <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>  
  • 14.   プロセスモデル   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
  • 15.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”
  • 16.   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
  • 17.   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
  • 18.   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
  • 21.   サンプルプログラム   Rooを利用して作成   DBにデータを格納するSpring MVCを利用したWeb アプリケーション   Pizza Shop http://www.springsource.org/roo/guide?w=beginning   作成したサンプルをHerokuで実行するように 変更
  • 22. project --topLevelPackage com.sample.pizzashop   Mavenを利用してビルド   AspectJを利用している
  • 23. persistence setup --provider HIBERNATE -- database HYPERSONIC_IN_MEMORY   JPAの初期設定   persistence.xmlやSpringの設定などを追加
  • 24.   作成するエンティティ   Topping – トッピング   Base – 生地   Pizza – ピザ   PizzaOrder – ピザの注文 entity --class ~.domain.Topping --testAutomatically field string --fieldName name --notNull --sizeMin 2 entity --class ~.domain.Base --testAutomaticallyfield string --fieldName name --notNull --sizeMin 2
  • 25. entity --class ~.domain.Pizza –testAutomatically field string --fieldName name --notNull --sizeMin 2 field number --fieldName price --type java.lang.Floatfield set --fieldName toppings --type ~.domain.Topping field reference --fieldName base --type ~.domain.Base
  • 26. entity --class ~.domain.PizzaOrder -- testAutomaticallyfield string --fieldName name --notNull --sizeMin 2 field string --fieldName address --sizeMax 30 field number --fieldName total --type java.lang.Float field date --fieldName deliveryDate --type java.util.Date field set --fieldName pizzas --type ~.domain.Pizza
  • 27. web mvc setup web mvc all --package ~.web
  • 28. perform tests   テストの実行 perform eclipse   Eclipse関連のファイルの作成
  • 29.   ひとまず実行 mvn jetty:run http://localhost:8080/pizzashop へアクセス
  • 30.   herokuへデプロイ   .gitignoreを作成 target   gitにアプリケーションを格納 git init git add . git commit –m “init”   herokuにデプロイ git push heroku master
  • 33.   Herokuが提供するデータベースはPostgreSQL   Shared Databaseは5MBまで無償で利用可能   有料オプションもあり   DATABASE_URL環境変数にDBへの接続情報 が格納されている
  • 34.   データベース関連の設定   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>
  • 35.   データベース関連の設定   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>
  • 36.   起動用の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>
  • 37.   サービス起動用の設定 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/
  • 38.   herokuへデプロイ   gitにアプリケーションを格納 git add . git commit –m “Support PostgreSQL”   herokuにデプロイ git push heroku master
  • 40.   www.database.com   native cloud database service   RESTやSOAPのAPIを通してデータにアクセス   OAuth、SAMLを用いて認証
  • 41.   http://forcedotcom.github.com/java-sdk/   Javaアプリケーションからdatabase.comにアク セスするためのモジュール   API Connector   JPA Provider (datanucleusベース)   Oauthによる認証/認可   Spring Securityプラグイン   自動コード生成モジュール (既存のオブジェクトか らEntityを自動生成)
  • 43.   データベース関連の設定   JPAプロバイダとしてDatanucleusを利用するように 設定 (databaseは何でも良い) 以下をRooで実行 persistence setup --provider DATANUCLEUS_2 --database POSTGRES
  • 44.   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>
  • 45.   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>
  • 46.   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>
  • 47.   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
  • 48.   Entityの変更   Database.comの制限   ManyToManyは未サポート   要件に合わせて、OneToMany、ManyToOneに変更する   中間テーブル用のEntityを作成する   上記変更に合わせ、以下も修正   テストクラス   Webのコントローラクラス
  • 49.   環境変数の設定   database.comのコネクタは、FORCE_<コネクション 名>_URL環境変数で指定された接続先に接続   コネクション名は、JPAであればpersistence-unitの名前 export FORCE_FORCEDATABASE_URL="force:// login.salesforce.com? user=xxx@sample.com&password=passwd"   ローカルで実行 mvn jetty:run
  • 50.   環境変数の設定 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
  • 52.   addons.heroku.com
  • 53.   Java on heroku   heroku上でJavaアプリケーションを動かすことがで きる   gitを利用してデプロイ   Mavenを利用してビルド   Java EEではない   データソース   herokuで提供されるDBはPostgreSQL   database.comなど外部のツールとも連携可能   herokuのAdd-onによって様々なデータソースが利 用可能