18
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaEEで作ったソフトのアップロードはどうするの?

Last updated at Posted at 2016-11-30

#はじめに
 これは、JavaEE Advent Calendar 2016 の第1日目の記事です。

 JavaEEについて学習し、仕組みがわかってくると、何か作れそうな気がしてきて「じゃぁ、アレを作ってみよう」などと考えます。そして、できれば仕事で使えるものにしたいと思うのが人情です。すると、必ず湧いてくる疑問が「サーバーはどうする? アップロードってどうやるんだろう?」ということです。「わかりやすいJavaEE」(秀和システム刊)の読者からも、何度か同じような質問を頂きました。

 そこで、いい機会ですから、サーバーの準備やデータベースのセットアップ、そしてデプロイまで、あれこれまとめてお話しようと思います。自分でサーバーを持つなんてゼイタクと思う必要はありません。今では、案外、手軽に使うことができます。初めてでも大丈夫ですよ!

#1.サーバーをなんとかする -さくらのVPSを例にして-

A0520.png

 JavaEEのソフトウェアを動かすには、JavaやGlassfishが使えるサーバーが必要です。いわゆる”レンタルサーバー”は、ウェブサーバーは使えますが、JavaはもちろんGlassfishサーバーをインストールして動かすなんてことはできません。

 個人でも、VPS(virtual private server)をレンタルするのがいいでしょう。最近は業者さんも増えてきて、価格も安くなりました。GMOと**さくらのVPS**を使ったことがありますが、さくらはインストールのための解説記事をたくさん公開していて、初心者にもやさしいVPSです。本稿では、さくらのVPSを使うことを前提にお話しします。

 筆者が "さくらのVPS" で借りているのは、OS:CentOS、CPU:仮想3Core、メモリ:2GB、SSD:50GBで、月額1,706円です。
 このサーバー上にApacheでサポートウェブを開設し、解説ブログ JavaIndex「Q&AわかりやすいJavaEE」用にWordpressもインストールしています。また、JavaとGlassfishをインストールして、「わかりやすいJavaEE」に掲載したショッピングサイトの例題 雑貨屋さん.com を公開しています。さらに、ユーザー登録処理("読者になる"のボタンの処理)のサービスをはじめ、いくつかのJavaEEで作ったウェブアプリケーションも動かしています。

 これだけやってもSSDのディスクは、まだ30%程度しか使っていない状態なので、小規模な仕事ならこれで十分のようです。VPSのよいところは、監視や運用の手間が軽減できることと、ファイルのダウンロード速度が速いことです。以前は、ダイナミックDNSのサービスを使って自宅サーバーを構築・運営していましたが、VPSに替えてずいぶんよくなりました。

 VPSはOSによって値段が違います。WindowsOSのサーバーを選ぶと、Linux(CentOSが多い)を選択した場合に比べて、料金が1.5~2倍くらいになります。どちらにするか考えどころですが、Linuxに不慣れでもインストールの解説記事が公開されているので、それほど難しいわけではありません。それを見ながら、無料で使えるお試し期間(2週間)にトライしてみるといいでしょう。さくらのVPSでは、次のようなマニュアルを公開しています。

Sakura VPS マニュアル
初心者でもわかる!さくらVPS - Sakura VPS マニュアル

 この解説の通りに作業する(コピペ用のコマンドが書かれているので、それをそのまま入力する)だけで、Teratermを使ってサーバーにsshでログインししたり、ファイル転送をしたりできるようになります。また、ウェブサーバ、mySQL、PHPなどのインストールもできるはずです。

A0320.png

 なお、ファイル転送にwinSCPを使いたい場合はsynclogue naviさんの解説が役にたちます。

WinSCPの使い方から設定まで全てが分かる記事まとめ

#2.必要なモノを準備をする 

 JavaEEのアプリケーションを動かすには、JavaとGlassfishをVPSにインストールします。
この手順は、no14141さん(タイガー!タイガー!じれったいぞー(SE編))の次の記事が役に立つでしょう。

CentOS7.0へGlasssfish4.1インストール

#3.アプリケーションをアップロード
では、準備がおわったら、作ったアプリケーションをGlassfishにアップロード(本当は、配備とかデプロイなどという)しましょう。

A0470.png
 

 NetBeansは、デプロイするwarファイルを自動的に作成しています。
 まず、NetBeansの3つのタブ(プロジェクト、ファイル、サービス)のうち、ファイルタブを開きます。例えば、デプロイしたいのがdb_Custormerプロジェクトなら、それに対応するdb_Customerフォルダが見えるはずです。
 フォルダを展開するとその中にdistというフォルダがあります。distフォルダにdb_Customer.warファイルが入っています。ただ、これはNetBeansの中での表示ですから、warファイルが実際にはどこにあるか、右ボタンでファイルをクリックし、プロパティを見て調べる必要があります。

  A0460.png

 なお、distフォルダがない時は、プロジェクトタブをクリックして戻り、プロジェクトを右クリックして、[消去してビルド]を実行します。たまに、消去できずに失敗することがありますが、その場合は、[ビルド]を実行すればいいでしょう。この操作により、distフォルダが作成され、その中にwarファイルが生成されます。
 

A0340.png

 warファイルをGlassfishサーバーにデプロイするには、サーバー管理コンソールから行うと簡単です。[Application]→[deploy]→[ファイルを選択]とボタンを選択して、最後に[OK]を押すだけです。

① Applicationをクリックする
ee01.jpg

②[Deploy]ボタンを押す
ee02.jpg

③[ファイルを選択]ボタンを押す
ee03.jpg

④ファイルを選択して[開く]ボタンを押す
ee04.jpg

⑤[OK]ボタンを押す
ee05.jpg

⑦リストにデプロイしたファイルが表示される
ee06.jpg

#4.コネクションプールとデータソースがないとデータベースは使えない

A0400.png

注記
Glassfishのサーバーコンソールでは、GUIでコネクションプールとデータソースを作成できるようになっていますが、4.1以降のバージョンでは、正常に動作しないようです。4.1では一見作成できたかに見えるのですが、pingでエラーになり、接続できません。また、4.1.1では内部エラーを起こしてしまいます。コマンドを使って作成すると、確実に動作するので、ここではコマンドを使う方法を紹介しています。

 Glassfishには、JavaDBというデータベースシステムが付属しています。ここでは、ダウンロードしたglassfishを/usr/localに解凍した場合の例で示します。/usr/local/glassfish4フォルダの中にあるjavadbフォルダが、付属するjavadbです。

##(1)データベースを作成する

 まず、Teratermでサーバーにログインします。
 そして、次の手順で、データベースmydbを作成します。

1	#> su glassfish
2	$> cd /usr/local/glassfish4/bin
3	$> asadmin start-database
4	・・・省略・・・
5	Command start-database executed successfully
6	$> cd /usr/local/glassfish4/javadb/bin
7	$> ./ij
8	ijバージョン10.10
9	ij>connect 'jdbc:derby://localhost/mydb;create=true;user=APP;password=APP';
10	ij>exit;

※プロンプトは簡略に表記しています(以下も同様)。
 
<説明>
1: ユーザー glassfishに切り替える (glassfishインストール時に作成したユーザー)
2: glassfishのコマンドがあるディレクトリに切り替える
3: データベースサーバーを起動する
6: JavaDBのコマンドがあるディレクトリに切り替える
7: ijコマンドモードに入る(データベースを操作できるようになる)
9: ユーザー名APP、パスワードAPPで、mydbというデータベースを作成する
10: ijコマンドモードを終了する

##(2)コネクションプールとデータソースを作成する
 「わかりやすいJavaEE」の393ページで解説していますが、JavaEEではデータベースをリソースとして扱います。そのため、コネクションプールとデータソースを定義しておく必要があるのです。
 

  0113160.jpaの構成-2.jpg

 
次は、作成したデータベースにアクセスするためのコネクションプールとデータソースを作る手順です。

<コネクションプールの作成:JavaDB用>

$> cd /usr/local/glassfish4/bin
$> <コネクションプール作成コマンド(下記)>

 コネクションプール作成コマンドを、意味が分かるように分かち書きしたものが次です。□は、半角の空白を意味します。入力する時は、半角の空白を含めて、改行せずにすべてを連続して入力し、最後にEnterキーをタイプしてください。

asadmin□create-jdbc-connection-pool
□--datasourceclassname□org.apache.derby.jdbc.ClientDataSource 
□--restype=javax.sql.DataSource 
□--property 
□user=APP:
□password=APP:
□DatabaseName=mydb:
□ServerName=localhost:
□port=1527:
□URL="jdbc\:derby\://localhost\:1527/mydb"□mydb-Pool

<データソースの作成: javadb用>
 コネクションプールができたら、次のコマンドをタイプし、データソースを作成します。

asadmin□create-jdbc-resource□--connectionpoolid□mydb-Pool□jdbc/mydb

A0490.png

とても手書きする気にはならないと思いますが、glassfish-resources.xmlは、次のような内容です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool
 	allow-non-component-callers="false"
	associate-with-thread="false" 
	connection-creation-retry-attempts="0"
 	connection-creation-retry-interval-in-seconds="10" 
	connection-leak-reclaim="false" 
	connection-leak-timeout-in-seconds="0" 
	connection-validation-method="auto-commit"
 	datasource-classname="org.apache.derby.jdbc.ClientDataSource"
 	fail-all-connections="false" 
	idle-timeout-in-seconds="300" 
	is-connection-validation-required="false" 
	is-isolation-level-guaranteed="true" 
	lazy-connection-association="false" 
	lazy-connection-enlistment="false" 
	match-connections="false" 
	max-connection-usage-count="0" 
	max-pool-size="32" 
	max-wait-time-in-millis="60000" 
	name="derby_net_mydb_APPPool" 
	non-transactional-connections="false" 
	pool-resize-quantity="2" 
	res-type="javax.sql.DataSource" 
	statement-timeout-in-seconds="-1" 
	steady-pool-size="8" 
	validate-atmost-once-period-in-seconds="0" 
	wrap-jdbc-objects="false">
        <property name="serverName" value="localhost"/>
        <property name="portNumber" value="1527"/>
        <property name="databaseName" value="mydb"/>
        <property name="User" value="APP"/>
        <property name="Password" value="APP"/>
        <property name="URL" value="jdbc:derby://localhost:1527/mydb"/>
        <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
    </jdbc-connection-pool>
    <jdbc-resource
		enabled="true"
 		jndi-name="jdbc/mydb" 
		object-type="user" 
		pool-name="derby_net_mydb_APPPool"/>
</resources>

 安心してください。これは、「わかりやすいJavaEE」の例題で、持続性ユニットを作る時に、自動的に生成されたものです。持続性ユニットを作る時、[新しいデータソース]を選択して、JNDI名やデータベース名を入力すると、プロジェクトに[サーバー・リソースフォルダ]ができ、その中に自動生成されます。

 このファイルをwinSCPで /usr/local/glassfish4/javadb/bin/ に送信して、次のようにタイプするだけで、コネクションプールとデータソースが生成されます。

$> cd /usr/local/glassfish4/bin
$> asadmin add-resources glassfish-resources.xml

 なお、winSCPでは、次の図のように、local側(左)からremote側(右)へ、ファイルをドラッグしてドロップします。すると、ダイアログが出るので、[Copy]ボタンを押すと転送されます。

ee09.jpg

 

A0380.png

#5.おわりに

 「わかりやすいJavaEE」のサポートウェブにも書いていますが、NetBeansの8.1と8.2は、glassfish-resources.xmlを作ってくれるところまではいいのですが、Glassfishサーバーにそれをうまく渡すことができないようです。そのため、コネクションプールやデータソースの自動生成がうまく働きません。また、注記に書いたように、Glssfish側にも問題があって、4.1以降は、サーバーコンソールでの作成もうまく機能しません。

 そこで、安全で確実な組み合わせとして、NetBeans8.02とGlassfish4.1を使うように、サポートウェブでお知らせしています。しかし、ここでお話した方法で、つまり、コマンドでコネクションプールとデータソースを作っておけば、NetBeansやGlassfishの最新版を使えると思います。コマンドプロンプトで、<Glassfishのインストールディレクトリ>/bin に切り替えて、asadmin add-resources glassfish-resources.xml を実行するだけです。glassfish-resources.xml は、binフォルダにコピーしておくか、パスを指定すればそれでもいいはずです。
 
追記:
 Java(SE)のAdvent Calendar13日目に、JavaSEでJPAを使う方法と、そのためのユーティリティクラスについて書きます。JavaSEでもEEのようにスマートにJPAを使えるようにしてみました。ぜひ、そちらの方もご覧ください。
 
 

18
24
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?