|
Java 環境まわり LastUpdate:
戻るjavaコマンドの代わりにjavawコマンドを使えば、コマンドプロンプトとは独立に実行されます。
C:\xxx> javaw my.package.MyApplication
と、http://www.dmz.hitachi-sk.co.jp/Java/Tech/jre/execution.html に書いてあった
クラスパスの中にブランク文字が含まれていると、これを引数に渡すような時に 引数が分裂してしまう。そのような時は、フォルダ名をセミコロンで囲っておくと良い。
また、クラスパスの中に漢字が含まれていると、ダメみたいである。
クラスパスの基本的な考え方は、環境変数classpathに依存する。pathではない!
http://java-house.jp/ml/archive/j-h-b/021880.html
2002/02/27
たとえば次のようなソースがあるとする。
// Main.java------------------------------------------------------
class Main {
public static void main(String args[]){
P1 p1 = new P1(); //外部のクラスを生成してみる。
p1.val1=1;
System.out.println("Hello World!");
System.out.println(p1.val1);
}
}
// P1.java------------------------------------------------------
class P1 {
public int val1;
public int val2;
}
Main.javaをコンパイルするとき、P1クラスが必要になるが、実験によると以下の動きをするようだ。
javacは、必要とするクラスファイルが無いとコンパイルできないので、自動的に最新状態でクラスファイルを整えようとするようです。
詳しい事は、\docs\ja\tooldocs\win32\javac.html に書いてあります。
クラスパスを指定する時、c:\test とすると、test
フォルダの中のクラスを検索する。
javac -classpath c:\test *.java
Jarファイルを指定する時は、Jarファイル名をフルパスで指定する必要がある。
javac -classpath .\jar\myClass.jar;.\jar\myClass2.jar xxx.java
クラスを指定する時は、そのクラスが含まれるフォルダ名を指定する。
javac -classpath .\myClass xxx.java
java -cp .\myClass;. xxx
jarでひとまとまりにされていないパッケージクラスがあったとする。
例として、package myclasses.utilty.class1
このパッケージはc:\java\test\pacage\myclasses\utilty\class1
配下にclassファイルがあったとする。
このパッケージをインポートするソースをコンパイルする時のクラスパスは、
classpath c:\java\test\pacage となります。
つまり、jarファイルでないので、直接jarファイルを指定しない。しかしパッケージ宣言されているため、パッケージのTopRootであるmyclassが存在するフォルダを指定する。
難しい!!
実行時に-cp でクラスパスを変更すると、set classpath = xxxx で 設定されたものが全て無効となり置き換えられる。よって、直接実行するクラスファイルも -cpで確実に指定する必要がある。
2001/11/05
import パッケージ名.*
import パッケージ名.クラス名
importをしなければならないのは、使用するクラスファイルがパッケージ宣言されており、かつ自分自身がそのパッケージに属していないときである。
しかし、毎回 「パッケージ名.クラス名」と書けば、importをしなくても良い。
パッケージ名は、その対象のディレクトリ構造や、存在位置に依存するかのごとく振る舞うが厳密には違う。パッケージ化された時のパッケージ名に従う。よって、実際の存在フォルダ名
クラスファイルか、jarファイルかの存在形態にも依存しない。
import test.*
としたとき、これは、「パッケージ名「テスト」に属するものを全て」という意味である。test.c1.c2.myclass
は参照されないので注意!
インナークラスをコンパイルした時に作成されるみたいだ。
http://www.gimlay.org/~javafaq/S004.html#S004-01
2001/11/05
jarファイルとは、単なる圧縮ファイルでしかない。実際はzipファイルである。よって拡張子をzipに変更すれば、各種アーカイバーソフトで閲覧などが可能である。
java tool、jar ユーティリティーのよくある使い方
jar -tf xxxxx.jar
jarファイルの中の一覧を表示する。
jar -tf xxxxx.jar > xxx.txt
一覧をテキストファイルに吐く。
jar -xf xxxxx.jar
jarファイルを展開する。(解凍する)
jar cvf explib.jar exp\*.class expフォルダ以下のclassファイルをexplib.jar
という名前で圧縮する
jar tvf explib.jar
explib.jar の中身の一覧
2001/11/06
data_008.mht でも止めた方がいいよ!
2001/11/23
Webアプリケーションからデータベースを利用するには大きく分類すると以下の3点の方法がある。
詳細は追って掲示予定。
2002/01/31
ドライバタイプの1〜4についての記述は
http://www.atmarkit.co.jp/fjava/rensai/jdbc01/jdbc01.html
2002/12/17
|
タイプ1:JDBC-ODBCブリッジ・ドライバ
J2SEに含まれています。これを使用するには、クライアントにインストールされている既存のODBCドライバが必要
タイプ2:ネイティブ・ブリッジ・ドライバ
データベース製品固有のクライアント・ライブラリが必要
タイプ3:ネット・プロトコル・ドライバ
タイプ3ドライバは、JDBCドライバでネイティブAPIをサポートする必要がないため、タイプ4ドライバに比べて軽量である点がメリットです。ですが、システム構成が複雑
タイプ4:ネイティブ・プロトコル・ドライバ
タイプ4のネイティブ・プロトコル・ドライバは、データベース製品固有のネイティブAPIを完全にJavaのみで実装。クライアント・ライブラリをインストールする必要がない。
Sun
http://java.sun.com/docs/codeconv/index.html
日本語訳
http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp/
Microsoft SDK for Java に含まれる JavaReg を使用してCOMコンポーネントに登録したら、使えるそうだ
あとは、CreateObject をするらしい…。
実験してないよ ネットで上記のキーワードから検索してみてね。
パッケージのソースフォルダに package.html というファイル名で 配置しておくと、javadocが読み取っていってくれる
<HTML> <BODY> JAVA DOC作成用サンプルクラスファイルが含まれています。
</BODY> </HTML>
http://park15.wakwak.com/~unixlife/java/dev-javadoc.html
java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]
options
- -Dproperty=value
- システムプロパティの値を設定します。 value が、スペースを含む文字列である場合は、文字列を次のように二重引用符で囲む必要があります。
java -Dfoo="some string" SomeClass
Java SDKのドキュメントに詳しく書いてあるです。
JAR ファイルは、ZIP圧縮されたものである。
jar ファイルの作り方の基本
jar cvf xxx.jar xxx
xxx フォルダ配下のファイルを、xxx.jar として作成してくれる。
c:アーカイブを新規作成する
v:標準出力に詳細な出力を生成する
f:アーカイブファイル名を指定する
たとえば、
jp/co/mycomp/projA/ClassA
jp/co/mycomp/projA/ClassB
の場合は、
jar cvf projA.jar jp とすると、jpフォルダ配下のファイルを圧縮してくれる。
Ant のメモ
http://muimi.com/j/jakarta/ant/ant2.html
以下のコードをJavaDocで出力した場合
このように、メソッドの概要に全て出力されてしまう
メソッドの概要に、表示されるのは、先頭1行だけというが、何をもって1行か?
読点 ”。” または、ピリオド を以て1行との事だ。<br>や<P>ではないらしいので注意。なお、ピリオドの後は、スペースや改行などが必要である。
Sun Developer Connection 技術情報ポータル
http://sdc.sun.co.jp/portal/index.html
Java 2 Platform Standard Edition 5.0 API 仕様(オンライン)
http://java.sun.com/j2se/1.5.0/ja/docs/ja/
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
ダウンロード
http://java.sun.com/j2se/1.5.0/ja/download.html
JDK 6 ドキュメント
http://java.sun.com/javase/ja/6/docs/ja/
http://java.sun.com/javase/ja/6/docs/ja/api/
Java 2 Platform, Enterprise Edition, v 1.3.1 API 仕様
http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/index.html
コントロールパネルから、アクセスできるようだ
チェックをはずせば、いんじゃないかな
http://java.sun.com/j2se/1.5.0/ja/download.html
JDK: JDK 5.0 Update 17
jdk-1_5_0_17-windows-i586-p.exe を実行
JavaAPI Doc
オンライン参照するなら
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
Eclipse上で Tomcat(6.0)のプロトタイピングをしていたら、Tomcatの初回実行後に、例外が発生してしまう
致命的: Error while registering Oracle JDBC Diagnosability MBean.
javax.management.MalformedObjectNameException: Invalid character
文字列の形式が有効な ObjectName に対応していません。
in value part of property
at javax.management.ObjectName.construct(ObjectName.java:602)
at javax.management.ObjectName.<init>(ObjectName.java:1403)
at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:303)
at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:213)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:209)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at resources.CustomerResource.getCustomerAsXml(CustomerResource.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
以下省略
環境 Eclipse 3.4.2
Oacle 11g 11.1.0.6.0
JDBC 11.1.0.6.0 ojdbc6.jar
対処方法
Oracleから、JDBCの新しい版がでているので、それを使用せよ
Oracle 11.1.0.7.0-Production JDBC 4.0 compiled with JDK6
以下のページから入手
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_111060.html
プロパティファイルに漢字が含まれている場合、そのまま読み込むと文字化けする。このような場合ユニコード変換を行なうようだ。
で、ユニコード変換を行うツールが native2ascii
JAVA_HOME のbin ファルダ配下にあります。
使い方は
native2ascii test.txt test.property
test.txt を 変換して test.property に出力
native2ascii -encoding UTF-8 test.txt test.property
test.txt をUTF-8 エンコーディングとみなして test.property に出力
-encoding を指定しない場合は、システム標準のエンコーディングになるようです。
その他の説明
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/tooldocs/win32/native2ascii.html
java6では native2ascii は 不要だとか?
http://d.hatena.ne.jp/shin/20090707/p4
ojdbc5.jar | JDK1.5用 |
ojdbc6.jar | JDK1.6用 |
JavaDocを生成するのは ドックレット担当している。ドックレットを変更してJavaDocの出力レイアウトを変更することができる。
詳しくはこちらで
DocLetを自分で作成して、それをデバッグする方法
GUIで メモリの使用状況などがみれる便利な JDKの標準ツール
EclipseのAllInOneパッケージでインストールした場合はJconsoleを起動しても、が、表示され、起動しなかった。
原因は、Jconsole.jar というモジュールが無いかららしい。
EclipseのAllInOneパッケージでインストールした時になぜ、Jcosole.exe は含まれるのに、Jconsole.jar が含まれないのかは不明
AntはJavaベースのビルドツール
AntはJakartaプロジェクトの中でも人気のあるツールの1つ
ダウンロードサイト
http://ant.apache.org/bindownload.cgi
Antの実行に必要な環境変数は以下の通り
・JAVA_HOME
・ANT_HOME
・PATH antのbinが追加されていること。
build.xmlはAntを実行する際に参照されるAntの振る舞いを記載した設定ファイル。
Antはこの設定ファイルに従い、javacの実行、jarファイルの作成などを行う。
Apache Ant 1.5 マニュアル
http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/index.html
参考
http://www.atmarkit.co.jp/fjava/rensai2/jakarta02/jakarta02.html
builder.xmlの構成
<プロジェクト>
<プロパティ/>
<ターゲットA>
<タスクA/>
</ターゲットA>
<ターゲットB 依存=ターゲットA>
<タスクB/>
</ターゲットB>
</プロジェクト>
プロジェクト
プロジェクトはbuild.xmlに1つだけ存在し、build.xmlを管理するもの
name | プロジェクト名を指定する | 任意 |
default | antコマンドの引数にターゲットが指定されなかった時に実行されるターゲット名を指定する | 必須 |
basedir | ビルド処理のベースとなるディレクトリを指定する。指定しない場合は、build.xmlが設置されているディレクトリになる。 | 任意 |
例
<project name="example" default="compile" basedir="."> -------------------- <target name="compile"> -------------------- -------------------- </target> </project>
プロパティはタスク内で使用できる変数を宣言する。
変数値は${name}で参照。
JavaAPIのシステムプロパティをあらかじめ設定された変数として参照することも可能。
name | プロパティ名を指定する | 必須 |
value | プロパティ名に対する値を指定 | 必須 |
例
<property name="dirA" value="D:\Program Files\java" />
antの組み込みプロパティ
ターゲット
ターゲットはビルド処理で行われる一連の一まとまりの処理を管理
name | ターゲット名を指定 | 必須 |
depends | 依存するターゲットのnameを指定 指定したターゲットが実行されるまで、このターゲットは実行されない。 カンマで複数指定する事が可能 |
任意 |
if | 設定されていなければならならいプロパティ名を指定。設定されていない場合、このターゲットは実行されない | 任意 |
unless | 設定してはいけないプロパティ名を指定。設定されている場合、このターゲットは実行されない | 任意 |
description | ターゲットの概要を記載 | 任意 |
例
ターゲットcompileでソースファイルをコンパイルし、ターゲットjarでコンパイルされたclassファイルをjarファイルに圧縮する例
ターゲットjarはターゲットcompileに依存しており、ターゲットcompileが実行されないと実行されることはない。
<target name="compile"> <!-- コンパイル処理 --> </target> <target name="jar" depends="compile"> <!-- jar処理 --> </target>
タスクはターゲット内の個々の処理を表す。
Antでは、非常に多くのタスクが定義されているが、そのうち主要なもの一部について
詳細は、http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/index.html
javacタスク
javacコマンドと同様の処理を行う。
srcdir javaソースファイルがあるディレクトリを指定する。 必須 destdir コンパイルしたclassファイルを出力するディレクトリを指定する。 任意 classpath classpathを指定する。 任意 classpathref あらかじめpathで設定したパスを指定 任意 includes コンパイルに含めたいファイルを指定する。 任意 excludes コンパイルから除きたいファイルを指定する。 必須 jarタスク
指定したファイルをjarファイルに圧縮する処理を行う。
destfile 圧縮されるjarファイル名を指定する。 必須 basedir jarファイルに圧縮したいファイルのルートディレクトリを指定する。 任意 mkdirタスク
ディレクトリを作成する処理を行う。
dir 作成するディレクトリ名を指定。必須 copyタスク
指定したファイルをコピーする処理を行う。
dir コピーしたいファイル名を指定する。必須 tofile コピー先のファイル名を指定する いずれかを必須指定 todir コピー先のディレクトリ名を指定する。
例 mkdirタスクを使用した例、javacタスクを使用した例
<target name="compile"> <!-- ディレクトリの作成 --> <mkdir dir="D:\classes"/> <!-- ソースファイルのコンパイル --> <javac srcdir="D:\sources" destdir="D:\classes" includes="HelloWorld.java" /> </target>
echoタスク
System.outが上書きされない限り、メッセージを現在のロガーやリスナーにエコーします。メッセージがフィルタリングされるログレベルを制御する levelを指定することができます。
属性 説明必須 message エコーするメッセージ この要素タグの間の文字データ部分にデータが無い限りは Yes file メッセージを書き出すファイル 任意 append 既存のファイルに追記するかどうか 任意 ディフォルトはfalse level このメッセージがレポートされるレベルを制御します。
"error"、"warning"、"info"、"verbose"、"debug"のいずれかです。任意 ディフォルトはwarning
antで使用するいくつかの代表的なコマンド例
ant
ビルド処理を行う。
設定ファイルはカレントディレクトリにあるbuild.xmlを使用。
ターゲットはprojectタグのdefault属性で指定されたターゲットを実行。
ant ターゲット名
ターゲット名を指定してビルド処理を行う。
ant -buildfile 設定ファイル
設定ファイル名がbuild.xmlでない場合や、カレントディレクトリにbuild.xmlがない場合に、-buildfileオプションで設定ファイルを指定する。
ant -version
現在使用しているAntのバージョンを表示する。
ant -help
antコマンドで利用できるオプションを表示する。
実例
C:\Javaディレクトリで作業をしており、ビルド処理後、コンパイルされたclassファイルをC:\Classesディレクトリへ配置する例。
<?xml version="1.0" encoding="Shift_JIS"?> <project name="example" default="compile" basedir="C:\"> <!-- propertyタグで変数source、compileを設定 --> <property name="source" value="./Java"/> <property name="compile" value="./Classes"/> <!-- ディレクトリClassesの作成 --> <target name="directory"> <mkdir dir="${compile}"/> </target> <!-- ディレクトリJava内のソースファイルをコンパイル --> <!-- ターゲットdirectoryに依存しているため、 ターゲットdirectoryを先に実行 --> <target name="compile" depends="directory"> <javac srcdir="${source}" destdir="${compile}" excludes="build.xml" /> </target> </project>
../../eclipse/eclipse_index.html#20100111_アントタスクの設定ファイル_build.xml_を自動生成する方法
手始めに、echoを使ったタスクを作成してみた
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!--20100111 antでechoを表示してみる --> <project name="20100111 ant echo" default="start1"> <target name="start1" description="start1!"> <echo message="start1!!!" /> </target> <target name="start2" depends="start1" description="start2!"> <echo message="start2!!!" /> </target> </project>
起動用のバッチファイルを作成してみた
set JAVA_HOME=C:\pleiades-e3.5\jre1.5
set ANT_HOME=C:\pleiades-e3.5\eclipse\plugins\org.apache.ant_1.7.1.v20090120-1145
set PATH=%PATH%;C:\pleiades-e3.5\eclipse\plugins\org.apache.ant_1.7.1.v20090120-1145\bin
ant start1
start1を実行
Buildfile: build.xml
start1:
[echo] start1!!!
BUILD SUCCESSFUL
Total time: 0 seconds
start2を実行
Buildfile: build.xml
start1:
[echo] start1!!!
start2:
[echo] start2!!!
BUILD SUCCESSFUL
Total time: 0 seconds
start1は、他に依存していないので、単独で実行しておわり。このとき、start2は実行されない。
start2は、start1に依存しているので、先にstart1が流れてからその後、start2が流れている!
ちょっと実践チックな build.xmlを作成してみた
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!--サーブレットのコンパイルをANTでやってみたい--> <project name="servlet compile sample" default="app.complie" > <property name="TOMCAT_HOME" value="/usr/share/tomcat5.5"/> <property name="projectRootDir" value="hogehoge"/> <property name="webframeworkJavaSourceDir" value="hogehoge"/> <property name="webApp1JavaSrcDir" value="hogehoge"/> <path id="fw.classpath"> <pathelement location="./lib/ant_lesson_test_lib.jar" /> </path> <target name="fw.compile" description="frameworkのコンパイル" > <echo message="フレームワークのコンパイル開始" /> <javac srcdir="./fw/src" destdir="./fw/bin" > <classpath refid="fw.classpath" /> </javac> <echo message="フレームワークのコンパイル終了" /> </target> <target name="fw.jar" description="frameworkをjarにする" depends="fw.compile" > <echo message="フレームワークをJARにする 開始" /> <jar basedir="./fw/bin" destfile="./lib/ant_lesson_fw.jar" /> <echo message="フレームワークをJARにする 終了" /> </target> <property name="TOMCAT_HOME" value="C:/pleiades-e3.5/tomcat5.5"/> <path id="webapplication.classpath"> <!-- pathelement location="WEB-INF/classes"/ --> <pathelement location="${TOMCAT_HOME}/common/lib/servlet-api.jar"/> <pathelement location="${TOMCAT_HOME}/common/lib/jasper-runtime.jar"/> <pathelement location="${TOMCAT_HOME}/common/lib/jsp-api.jar"/> <pathelement location="./lib/ant_lesson_test_lib.jar" /> <pathelement location="./lib/ant_lesson_fw.jar"/> </path> <target name="app.complie" description="WEBアプリをコンパイルする" depends="fw.jar" > <echo message="WEBアプリをコンパイルする 開始" /> <javac srcdir="./app/src" destdir="./app/WEB-INF/classes" > <classpath refid="webapplication.classpath" /> </javac> <echo message="WEBアプリをコンパイルする 終了" /> </target> <target name="compilewebApp1JavaSrcDir" description="servlet compile" > <echo message="start compile" /> <javac srcdir="${webApp1JavaSrcDir}" destdir="${projectRootDir}/WEB-INF/classes" > <classpath refid="webapplication.classpath"/> </javac> </target> </project>
2010/01/19 1:03:45 org.apache.catalina.core.StandardWrapperValve invoke
致命的: サーブレット controlServlet のServlet.service()が例外を投げました
java.lang.UnsupportedClassVersionError: Bad version number in .class file
(unable to load class myFramework.HtmlBody)
Javacによると
Java
仮想マシンが、クラスファイルの読み込み中に、そのファイルのメジャーバージョン番号とマイナーバージョン番号がサポートされていないと判定した場合にスローされます。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/
バージョンを調べ方 javap
javap -v クラス名 .class は指定不要
ではさっそく見てみましょう
C:\aaa> C:\aaa>javap -v HtmlBody Compiled from "HtmlBody.java" public class myFramework.HtmlBody extends java.lang.Object SourceFile: "HtmlBody.java" minor version: 0 major version: 49 Constant pool: const #1 = class #2; // myFramework/HtmlBody const #2 = Asciz myFramework/HtmlBody; 以下省略
なので、HtmlBody は 1.5
同様に呼び元もクラスを見てると
C:\aaa>javap -v ControlServlet Compiled from "ControlServlet.java" public class myApp.ControlServlet extends javax.servlet.http.HttpServlet SourceFile: "ControlServlet.java" minor version: 0 major version: 49 Constant pool:
同じだなぁ。。。
オぉぉ発見 親側のlibに jarがある。この中のクラスを展開して java-pしてみれると
C:\aaa>javap -v HtmlBody Compiled from "HtmlBody.java" public class myFramework.HtmlBody extends java.lang.Object SourceFile: "HtmlBody.java" minor version: 0 major version: 50
見つけた!! これだ。ただしいバージョンでリコンパイルして対応しましょう
http://www.findjar.com/index.x
ここのページが便利
..\..\eclipse\profile\profile.html
参考ページ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35323&forum=12
Java デバッグツール NetBeans Profiler
http://www.okisoft.co.jp/esc/debugtool/netbeans.html
Linux上(CentOS5.0)のTomcatで稼働するアプリケーションにリモートでプロファイリングを行う。
http://d.hatena.ne.jp/flick-flick/20070914
NetBeans ProfilerによるTomcatのリモートプロファイリング
http://www.okisoft.co.jp/esc/debugtool/netbeans6.html
メモリリーク実装例
http://d.hatena.ne.jp/kimabuu/20080124/p1
Javaの理論と実践: 弱参照でメモリー・リークを塞ぐ
http://www.ibm.com/developerworks/jp/java/library/j-jtp11225/
[Java] hprof用CPU使用率解析ツール PerfAnal
http://blog.livedoor.jp/froo/archives/50622163.html
JDK に標準付属のプロファイリングツール hprof の使用方法
http://blog.livedoor.jp/lalha_java/archives/50741776.html
TRACE の深さを変更するには: depth=n (ex. depth=8)
http://jakarta.apache.org/jmeter/
JMeter(高機能/フリーなテストツール)第1回:JMeterの基本
http://www.stackasterisk.jp/tech/engineer/jmeter01_01.jsp