Category: ‘Java’

Spring Roo Macへのインストール

2012年10月15日 Posted by PURGE

Mac環境へ、Spring Roo をダウンロードして解凍し、インストールした場合の設定。
/usr/local/roo/bin 配下に、roo.sh と roo.bat が存在する為、パスを通してシンボリックリンクを作成して、パスを通す。

$ ln -s /usr/local/roo/bin/roo.sh roo
$ vi .bashrc 
export PATH=$PATH:/usr/local/roo/bin

rooコマンドにて起動する。

$ roo
    ____  ____  ____  
   / __ \/ __ \/ __ \ 
  / /_/ / / / / / / / 
 / _, _/ /_/ / /_/ /  
/_/ |_|\____/\____/    1.2.2.RELEASE [rev 7d75659]


Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
@rooinaction: @SpringRoo Second blog post on testing Roo Add-ons is here - Mockito and the Argument Captor. http://t.co/S4wfLyAI 
Version is required for org.apache.maven.plugins:maven-compiler-plugin

SpringSource Tool Suite と Maven での不具合

2012年10月9日 Posted by PURGE

インストール後の初回プロジェクト作成時に、eclipseベースの SpringSource Tool Suite を使用していると、動作が調子悪く思ったので覚え書き。

どうやら、eclipse の設定ファイルに下記のオプションを付けるべきなようだ。

-vm
\c:\\jdk1.6\bin\javaw.exe

これは、maven 起動時に、java sdk のコンパイラを使用するかららしい。
デフォルトでは、jreのランタイムによって eclipse が起動している場合が多いので、このオプションで対応すると上手くいくと思う。

それにしても、maven経由でコンパイル等が行われるとやはり遅い。

SpringSource Tool Suite と Maven の関係

2012年10月8日 Posted by PURGE

そもそも Maven を使用すること自体経験上無く、今更インストールして使用することとなった訳だが、具体的に何をしてくれるのかが不明。

しかし、SpringSource Tool Suite で、プロジェクトを新規作成してみると、プロジェクトのビルドパスに、いつの間にやら必要なjarファイル群が設定されている。
そもそも、これらのjarファイル群はどこから来たのか?

調べてみると、WindowsXP の場合、C:\Documents and Settings\xxxxxx\.m2\repository の中に、ダウンロードされている。
これ自体がMaven の設定で、Mavenレポジトリとして、デフォルトとしてダウンロードされているようだ。

これらは、プロジェクト内にあるpom.xml に必須ライブラリとして記載されているようだ。

知らないと面倒だが、少しづつ勉強中である。

Spring Rooを触ってみる

2012年10月6日 Posted by PURGE

Blogのエントリには記載していないが、JavaのFrameworkとしては、Seasar2を使用してきた。
今回どういうわけか、SpringFrameworkに接する機会があったので、現在勉強中なのであるが、勢い余って Spring Roo に挑戦してみようと思った。
そもそも、SpringFramework に関しては約10年前程に知識不足で脱落していた。
それ以来、興味も何もなかったが、Seasar2 に慣れて、概念的な部分の理解はクリアしているつもりなので、今回は、SpringFramework 自体も、10年前よりもスンナリと頭で想像できた。つもり。

大方は、SpringRoo のサイト(英語)に記載してある通りだが。
準備としては、Maven と Roo をダウンロード&インストールして、システムのパスに含めてさぁ開始。

C:\works\hello>roo
    ____  ____  ____
   / __ \/ __ \/ __ \
  / /_/ / / / / / / /
 / _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.2.2.RELEASE [rev 7d75659]

Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
@krimple: Just submitted my talk proposal for SpringOne/2GX on Roo add-on development. Keeping finge
rs crossed? @SpringRoo

At this time you have not authorized Spring Roo to download an index of
available add-ons. This will reduce Spring Roo features available to you.
Please type 'download status' and press ENTER for further information.

roo>

お手本通りに、hint コマンド。

roo> hint
Welcome to Roo! We hope you enjoy your stay!

Before you can use many features of Roo, you need to start a new project.

To do this, type 'project' (without the quotes) and then hit TAB.

Enter a --topLevelPackage like 'com.mycompany.projectname' (no quotes).
When you've finished completing your --topLevelPackage, press ENTER.
Your new project will then be created in the current working directory.

Note that Roo frequently allows the use of TAB, so press TAB regularly.
Once your project is created, type 'hint' and ENTER for the next suggestion.
You're also welcome to visit http://forum.springframework.org for Roo help.

トップレベルのパッケージを打ってくれとのことなので。とりあえず、sampleパッケージ。

roo> project --topLevelPackage com.whoocus.sample
Created ROOT\pom.xml
Created SRC_MAIN_RESOURCES
Created SRC_MAIN_RESOURCES\log4j.properties
Created SPRING_CONFIG_ROOT
Created SPRING_CONFIG_ROOT\applicationContext.xml

わお!!雛形が作成されている。

次は、DBの設定。正直、jpa とか hibernate に関しては無知なので、後に調べるとして、お手本通りにコマンド打ってみる。
ちなみに、DBは、MySql。”MYSQL” と大文字で打ち込まないと、エラーになった。

roo> jpa setup --provider HIBERNATE --database MYSQL --hostname localhost --databaseName roo_db -
-userName hoge --password hoge
Created SPRING_CONFIG_ROOT\database.properties
Please update your database details in src/main/resources/META-INF/spring/database.properties.
Updated SPRING_CONFIG_ROOT\applicationContext.xml
Created SRC_MAIN_RESOURCES\META-INF\persistence.xml
Updated ROOT\pom.xml [added dependencies mysql:mysql-connector-java:5.1.18, org.hibernate:hibernate-
core:3.6.9.Final, org.hibernate:hibernate-entitymanager:3.6.9.Final, org.hibernate.javax.persistence
:hibernate-jpa-2.0-api:1.0.1.Final, commons-collections:commons-collections:3.2.1, org.hibernate:hib
ernate-validator:4.2.0.Final, javax.validation:validation-api:1.0.0.GA, cglib:cglib-nodep:2.2.2, jav
ax.transaction:jta:1.1, org.springframework:spring-jdbc:${spring.version}, org.springframework:sprin
g-orm:${spring.version}, commons-pool:commons-pool:1.5.6, commons-dbcp:commons-dbcp:1.3]

わおっ!!設定ファイルが生成された。pom.xml も更新されるようだ。正直、pom.xml は過去にも良く見かけたことがあったのだが、何者であるか知らなかった。Maven関連のファイルらしいと気付く。Mavenも、名前だけで何だか知らなかったのだけどね。
これも、これから勉強予定。

そして、今度はエンティティクラス生成かな?
Memberクラスを打ち込む。
が、しかし生成されず、Userクラスはどうか?
やはり駄目。

roo> entity jpa --class model.Member --testAutomatically
Reserved SQL keyword 'Member' is not permitted as simple type name
model.Member roo> field string --fieldName lastName --notNull
The type specified, 'model.Member'doesn't exist

model.Member roo> entity jpa --class ~.User --testAutomatically
Reserved SQL keyword 'User' is not permitted as simple type name

お手本通り、Timerクラスで打ち込むと成功。でも、そんなエンティティはいらない。
調べてみると、オプション(–permitReservedWords)を付加すると、作成されるらしい。

どうも簡単な単語は、はじかれてしまうようだ。Order とか。ちょっと腑に落ちない。

~.Member roo> entity jpa --class ~.Member --testAutomatically --permitReservedWords
Created SRC_MAIN_JAVA\com\whoocus\sample\Member.java
Created SRC_TEST_JAVA\com\whoocus\sample\MemberDataOnDemand.java
Created SRC_TEST_JAVA\com\whoocus\sample\MemberIntegrationTest.java
Created SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_Configurable.aj
Created SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_Jpa_Entity.aj
Created SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_Jpa_ActiveRecord.aj
Created SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_ToString.aj
Created SRC_TEST_JAVA\com\whoocus\sample\MemberDataOnDemand_Roo_Configurable.aj
Created SRC_TEST_JAVA\com\whoocus\sample\MemberDataOnDemand_Roo_DataOnDemand.aj
Created SRC_TEST_JAVA\com\whoocus\sample\MemberIntegrationTest_Roo_Configurable.aj
Created SRC_TEST_JAVA\com\whoocus\sample\MemberIntegrationTest_Roo_IntegrationTest.aj

成功!!
ソースファイルフォルダを見てみると、ソースファイル出来てます。感動です。
まるで、Ruby on Rails のようです。まあ、Rails っぽかったから、SpringRoo に挑戦している訳ですが…。

そして、Memberクラスのフィールド定義。

~.Member roo> field string --fieldName lastName --notNull
Updated SRC_MAIN_JAVA\com\whoocus\sample\Member.java
Updated SRC_TEST_JAVA\com\whoocus\sample\MemberDataOnDemand_Roo_DataOnDemand.aj
Created SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_JavaBean.aj
~.Member roo> field string --fieldName firstName --notNull
Updated SRC_MAIN_JAVA\com\whoocus\sample\Member.java
Updated SRC_TEST_JAVA\com\whoocus\sample\MemberDataOnDemand_Roo_DataOnDemand.aj
Updated SRC_MAIN_JAVA\com\whoocus\sample\Member_Roo_JavaBean.aj
~.Member roo> field int --fieldName age --notNull

わおっわおっ。Javaのソースコードも更新されている。ナイス。

package com.whoocus.sample;

import javax.validation.constraints.NotNull;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Member {

    @NotNull
    private String lastName;

    @NotNull
    private String firstName;
}

調子に乗って、int型のフィールドを定義しようとしたが、エラー。
Integer型ならどうだっ? エラー。

~.Member roo> field int --fieldName age --notNull
Command 'field int --fieldName age --notNull' not found (for assistance press TAB or type "hint" then hit ENTER)

At this time you have not authorized Spring Roo to download resources from
VMware domains. Some Spring Roo features are therefore unavailable. Please
type 'download status' and press ENTER for further information.

Spring Roo automatic add-on discovery service currently unavailable
~.Member roo> field integer --fieldName age --notNull
Command 'field integer --fieldName age --notNull' not found (for assistance press TAB or type "hint" then hit ENTER)

どうやら、int型の指定方法は下記のようだ。

~.Member roo> field number --fieldName age --type int

おやつの時間なので、とりあえずここまで。
また次回。

お気に入りeclipseプラグイン

2012年1月10日 Posted by PURGE

eclipseプラグインのダウンロードサイト

■Seasar2
http://www.seasar.org/updates.html

eclipseプラグインのアップデートサイト

■Subclipse
http://subclipse.tigris.org/update_1.8.x

■ER Master
http://downloads.sourceforge.net/project/ermaster/ermaster

■DB Viewer
http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/

■Oracle
http://download.oracle.com/otn_software/oepe/helios
http://download.oracle.com/otn_software/oepe/indigo

Could not find the main class: eclipseエラー

2012年1月10日 Posted by PURGE

長年使用しているeclipseで突然のエラー。
Adobeのお試し版のアンインストールで環境変数が削除されたのが原因らしいが、eclipseを起動するたびにエラーポップアップの嵐。

Could not find the main class:
org.eclipse.jdt.internal.launching.support.LibraryDetector.
Program will exit.

丸1日ハマって、対処方法は下記のうち1つを設定すること。

環境変数に、JAVA_HOME を設定する
または
環境変数 %PATH%に、%JAVA_HOME%bin を設定する
または
eclipse.ini に、-vm %JAVA_HOME%binjavaw.exe を設定する

自称Javaエキスパートですら、こんな基本的な部分に落とし穴。
だって、eclipse の環境設定では、インストールされている jre 欄にちゃんと上記の設定は認識しているものだから、当然のようにeclipseは認識していると思っていた。
全くのノーマークだった。

お恥ずかしい。

JDK1.6のインストールとAlternatives

2011年12月21日 Posted by PURGE

毎回インストール方法が簡単になるけど、反面ブラックボックス化して理解不能になるので覚え書き。

ここから、jdk-6u30-linux-x64.bin をダウンロードして解凍。
ちなみに、jdk-6u30-linux-x64-rpm.bin は勝手にインストールしてくれるので、自分的にはNG。

余談だが、X86 と X64 は、64bit版がX64で、32bit版がX86。
数値の大小がまぎらわしい。 Windows7 と Windows98 みたいなもの・・・。

[user@server src]$ sudo ./jdk-6u30-linux-x64.bin
Unpacking...
Checksumming...
Extracting...
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu).
   creating: jdk1.6.0_30/
   creating: jdk1.6.0_30/db/
   creating: jdk1.6.0_30/db/bin/
  inflating: jdk1.6.0_30/db/bin/ij

…省略

Creating jdk1.6.0_30/jre/lib/ext/localedata.jar
Creating jdk1.6.0_30/jre/lib/plugin.jar
Creating jdk1.6.0_30/jre/lib/javaws.jar
Creating jdk1.6.0_30/jre/lib/deploy.jar

Java(TM) SE Development Kit 6 successfully installed.

Product Registration is FREE and includes many benefits:
* Notification of new versions, patches, and updates
* Special offers on Oracle products, services and training
* Access to early releases and documentation

Product and system data will be collected. If your configuration
supports a browser, the JDK Product Registration form will
be presented. If you do not register, none of this information
will be saved. You may also register your JDK later by
opening the register.html file (located in the JDK installation
directory) in a browser.

For more information on what data Registration collects and
how it is managed and used, see:
http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html

Press Enter to continue.....

Done.

解凍されたディレクトリを、お好みの場所へ移動。

[user@server src]$ sudo mv jdk1.6.0_30 /usr/local/jdk1.6
[user@server src]$ ls /usr/local/jdk1.6/

javaのバージョンを調べると古いまま・・・。
どうやらalternatives というもので管理されているよう。
OS初期状態では、/usr/lib/jvm/jre-1.4.2-gcj/bin/java が実態としてリンクされている模様。

[root@servere ~]# alternatives --config java

1 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.4.2-gcj/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

alternatives –install で、今回インストールしたディレクトリを指定する。
ちなみに、最後の30は優先順位らしいが、いくつでもよい。指定しないと怒られる。

[root@server ~]# alternatives --install /usr/bin/java java /usr/local/jdk1.6/bin/java 30
[root@server ~]# alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.4.2-gcj/bin/java
   2           /usr/local/jdk1.6/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

どうやら上手くいったようだ。

ちなみに、ユーザは /usr/bin/java を環境変数のパスで参照しに行っている。
/usr/bin/java → /etc/alternatives/java → /usr/local/jdk1.6/bin/java

慣れれば便利だが、知らないと手動で ln -s してしまいそう。
下記のコマンドは、alternativesを使用しているようなので気を付けよう。

antlr              ksh             mta-newaliases     print-cancel     print-lpqman
java               ksh-man         mta-newaliasesman  print-cancelman  print-lprm
jaxp_parser_impl   ksh-usrbin      mta-pam            print-lp         print-lprman
jre_1.4.2          mta             mta-rmail          print-lpc        print-lprmman
jre_1.4.2_exports  mta-aliasesman  mta-sendmail       print-lpcman     print-lpstat
jre_gcj            mta-mailq       mta-sendmailman    print-lpman      print-lpstatman
jre_gcj_exports    mta-mailqman    print              print-lpq        xinputrc

Seasar2 と DWR連携

2011年10月4日 Posted by PURGE

まずは、DWRのサイトからjarファイルをダウンロードし、/WEB-INF/lib フォルダへ配置してクラスパスを通す。

/WEB-INF/web.xml

<servlet>
	<display-name>DWR Servlet</display-name>
	<servlet-name>dwr-invoker</servlet-name>  
	<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>true</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>dwr-invoker</servlet-name>
	<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

まずは、DWR Servletのweb.xmlへの設定。
/dwr/* で来たリクエストを同Servletが受けるように設定する。

/WEB-INF/dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC 
  "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" 
  "http://getahead.org/dwr/dwr20.dtd">
<dwr>
	<init>
		<creator id="s2creator" class="packagename.S2Creator" />
	</init>
	<allow>
		<create creator="s2creator" javascript="ajaxService">
			<param name="serviceName" value="ajaxService"/>
		</create>
	</allow>
</dwr>

指定したCreatorクラスが、Seasar2が管理しているServiceクラスを返すように定義する。
<init>では、creator の id (任意)と class属性は対象クラス名を指定する。
<param>では、S2Creator.javaクラスでDIする name(setterでセットするプロパティ名)とvalue(class名)を指定する。

S2Creator.java

package packagename.creator;

import org.directwebremoting.create.AbstractCreator;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class S2Creator extends AbstractCreator {
	
	private String serviceName;
	
	@Override
	public Object getInstance() throws InstantiationException {
		
		return SingletonS2ContainerFactory
				.getContainer()
				.getComponent(serviceName);
	}

	@Override
	public Class<?> getType() {
		return SingletonS2ContainerFactory
				.getContainer()
				.getComponentDef(serviceName)
				.getComponentClass();
	}

	public void setServiceName(String serviceName) {
		this.serviceName = serviceName;
	}
}

dwr.xmlで指定したサービス名で、コンテナからserviceクラスを返す。

AjaxService.java

package packagename.service;

public interface AjaxService {
	
	/**
	 * @param name
	 * @return
	 */
	String hello(String name);

}

実際のServiceが定義されたインタフェースクラス。

AjaxServiceImpl.java

package packagename.service.impl;

import package.name.service.AjaxService;

public class AjaxServiceImpl implements AjaxService {

	@Override
	public String hello(String name) {
		return "Hello " + name + "!!!";
	}
}

実際のサーバ処理を行うServiceクラス

index.jsp

<script src="/dwr/interface/ajaxService.js" type="text/javascript"></script>
<script src="/dwr/engine.js" type="text/javascript"></script>
<script src="/dwr/util.js" type="text/javascript"></script>

<script type="text/javascript">
$(function(){
	ajaxService.hello("AJAX", callBack);
});
function callBack(value){
	alert(value);
}
</script>

JSP(HTML)で、サーバ側に自動生成されるjsファイルの場所を定義する。
/dwr/interface/ajaxService.js
/dwr/engine.js
/dwr/util.js

dwr.xml で定義したJavaScript名でメソッドを呼べる。
この場合、第1引数は、サーバへのパラメータで、第2引数は非同期でコールバックされるJavascriptの関数名を指定する。

おそらくこれで動作するはずである。
難しく考えていたが、設定が終わればかなり簡単にAjax通信ができるようになる。

DWRの詳細はこちら(DWR)を参照してください。

Ant の SCPタスク

2011年9月28日 Posted by PURGE

Antでサーバデプロイまで行いたい時、SCPタスクが便利です。
但し、eclipse(Ant1.7) では、Antタスクとしては登録されていますが、下記jarファイルを Antのクラスパスへ設定する必要があります。尚、jarファイルは eclipse/plugin フォルダ内に存在するので、クラスパスに指定するのみでOKです。

com.jcraft.jsch_xxxx.jar

そして、build.xml への記述は下記で、もし秘密鍵を使用している場合は、keyfileで指定します。
尚、パスワード設定していなくてもパスワードも求められました。原因はわかりません。

    <target name="scp"  description="Copy to Server">
    	<scp file="${targetfile}" todir="${scp.user}:${scp.passwd}@${scp.server}:." keyfile="${scp.keyfile}" trust="yes"></scp>
    </target>

お気に入り eclipse plugins

2011年8月3日 Posted by PURGE

DBViewer

ERMaster

Subclipse

Seasar2 Plugin

Tomcat Plugin