====== Java ====== ===== javac ===== === MouseInputHandler を継承したクラスを実行すると NoSuchMethodError が発生。 === MouseInputHandler を継承したクラスを -JDK 1.4 でコンパイル -JDK 1.3.1 で -target 1.3 を指定してコンパイル すると、実行時に NoSuchMethodError が発生しました。~ (jp.ne.mki.wedge.tool.client.component.table.TableHeaderUI) -対応~ ++JDK 1.3.1 で -target オプションを指定せずにコンパイル~ ++JDK 1.4.2 で -target 1.2 オプションを指定してコンパイル === class ファイルの 5 ~ 8バイト目に埋め込まれたバージョンID の対応一覧 === |1.1|00 03 00 2d| |1.2|00 00 00 2e| |1.3|00 00 00 2f| |1.4|00 00 00 30| |1.5|00 00 00 31| |1.6|00 00 00 32| ===== java ===== ==== コマンドラインオプション ==== - -XX:+PrintCompilation~ 実行時にコンパイル情報を表示します。 === Jakarta JMeter で指定されているチューニングオプション === set HEAP=-Xms256m -Xmx256m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50% set TENURING=-XX:MaxTenuringThreshold=2 set EVACUATION=-XX:MaxLiveObjectEvacuationRatio=20% set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000 set PERM=-XX:PermSize=64m -XX:MaxPermSize=64m set DEBUG=-verbose:gc -XX:+PrintTenuringDistribution === ヒープ関連のコマンドラインオプション === -Xloggc:<ファイル名> -XX:+VerifyBeforeScavenge -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+TraceGen0Time -XX:+TraceGen1Time -XX:+PrintHeapAtGC ===== 通信 ===== ==== ソケット通信 ==== === ソケット通信で java.util.Properties を送受信する。 === Properties 送信後、ソケット(java.net.Socket)に対して、shutdownOuptut() メソッドを発行すると、受信側が EOF まで受け取ることができるようになります。 ==== SSL通信 ==== === 「bad_record_mac」というメッセージのエラーが JDK 1.4.x で発生する。 === HTTP サーバ側が SSL 3.0 のみをサポートしている場合、JDK 1.4.x では SSL 3.0 の通信に問題があるため発生すると考えられます。~ (JDK 1.5 では発生しません。)~ HTTP サーバ側が TLS 1.0 をサポートすることにより回避することができます。 ===== セキュリティ ===== ==== 署名 ==== === jarsigner で OutOfMemoryError が発生し、サイズが大きい JAR ファイルに署名できない。 === ant で SignJar タスクの定義を行い、maxmemory 属性に、最大ヒープサイズを設定します。(例:512m) ==== 証明書 ==== === Apache の証明書を cacerts にインポート === keytool -import -trustcacerts -keystore %JAVA_HOME%\lib\security\cacerts -storetype jks -file cert.cer === 削除 === keytool -delete -keystore %JAVA_HOME%\lib\security\cacerts -alias wedge -storepass changeit === 一覧 === keytool -list -keystore cacerts -storepass changeit === JARファイルの署名を表示 === jarsigner -verify -verbose -certs ==== Permission ==== -レジストリアクセス~ java.util.prefs.Preferences を使ってレジストリを操作する場合~ RuntimePermission("preferences") *管理 [#y35fd3f5] **jconsole [#b0c9a095] Java VM 起動時のオプションに -Dcom.sun.management.jmxremote を指定。 (例) -Dcom.sun.management.jmxremote.port=49501 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 1行で記述します。 com.sun.management.jmxremote.port に続けてポート番号を指定すると、リモートマシンから接続して状況を監視することができます。com.sun.management.jmxremote.port を指定しなかった場合は、同一マシンからだけ監視することができます。 次に jconsole を実行して管理コンソールを起動し、監視を行います。 **Linux 環境で実行中の Java VM のスタックトレースを表示。 [#j2a9a79a] kill -s SIGQUIT <プロセスID> **Linux 環境で Java のプロセスを停止させ、コアダンプを出力させる。 [#ca3ff272] kill -s SIGILL <プロセスID>~ kill -s SIGSEGV <プロセスID>~ kill -s SIGFPE <プロセスID>~ **メモリのプロファイルを取る時のコマンドラインオプション例 [#fc083e76] #hr ~-agentlib:hprof=heap=sites,thread=n,depth=20,file=hprof_RunDB-`/bin/date +%Y%m%d%H%M%S`.txt #hr *Linux [#x4fae0f4] **RedHat Linux 9 で JDK 1.3.1 を使う場合。 [#jb985220] 環境変数 LD_ASSUME_KERNEL=2.2.5 を指定。 *XML [#p2202769] **xalan.jar のバージョンを表示するためのコマンドラインパラメータ [#e38926da] java -classpath xalan.jar org.apache.xalan.xslt.Process -V~ または~ java -jar xalan.jar -v **Xalan のコマンドラインパラメータ [#p90280f7] java -classpath xalan.jar org.apache.xalan.xslt.Process Xalan-J コマンド行 Process クラス・オプション: -共通オプション- [-XSLTC (変換に XSLTC を使用)]~ [-IN inputXMLURL]~ [-XSL XSLTransformationURL]~ [-OUT outputFileName]~ [-E (エンティティー ref を拡張しない)]~ [-EDUMP {optional filename} (エラー時に stackdump を実行。)]~ [-XML (XML フォーマッターを使用および XML ヘッダーを追加。)]~ [-TEXT (シンプル・テキスト・フォーマッターを使用。)]~ [-HTML (HTML フォーマッターを使用。)]~ [-PARAM 名前式 (stylesheet パラメーターを設定。)]~ [-MEDIA mediaType (文書と関連したスタイルシートを検索するメディア属性を使用。)]~ [-FLAVOR flavorName (変換を実行するために s2s=SAX または d2d=DOM を明示的に使用。)]~ [-DIAG (変換にかかった全ミリ秒を印刷。)]~ [-URIRESOLVER 絶対クラス名 (URI を解決するために使用する URIResolver)]~ [-ENTITYRESOLVER 絶対クラス名 (エンティティーを解決するために使用する EntityResolver)]~ [-CONTENTHANDLER 絶対クラス名 (出力をシリアライズするために使用する ContentHandler)]~ -Xalan 用オプション- [-QC (静止パターン矛盾警告)]~ [-TT (テンプレートを呼び出し中にトレース。)]~ [-TG (各生成イベントをトレース。)]~ [-TS (各選択イベントをトレース。)]~ [-TTC (テンプレートの子を呼び出し中にトレース。)]~ [-TCLASS (トレース拡張機能の TraceListener クラス。)]~ [-L ソース・ドキュメントの行番号を使用]~ [-INCREMENTAL (http://xml.apache.org/xalan/features/incremental を true に設定することにより増分 DTM 構造を要求。)]~ [-NOOPTIMIMIZE (http://xml.apache.org/xalan/features/optimize を false に設定することによりスタイルシート最適化処理なしを要求。)]~ [-RL recursionlimit (スタイルシートの再帰の深さについての数値限界を主張。)]~ -XSLTC 用オプション- [-XO [transletName] (名前を生成後の translet に割り当て)]~ [-XD destinationDirectory (宛先ディレクトリーを translet に指定)]~ [-XJ jarfile (translet クラスを名前 の jar ファイルにパッケージします)]~ [-XP package (パッケージ名接頭部をすべての生成後の translet クラスに指定します)]~ [-XN (テンプレートをインラインで使用可能にします)]~ [-XX (追加のデバッグ・メッセージ出力をオンにします)]~ [-XT (可能な場合は translet を使用して変換)]~ **UTF-8 でエンコードされた XML ファイルを読み込むとエラーが発生。(org.xml.sax.SAXParserException:ドキュメントのルート要素がありません。) [#fea304a3] BOM 付きの UTF-8 は Java ではうまく読み込むことができません。BOM なしで保存してください。 *System Property [#q181f87d] **JSSE [#o9898d0e] -javax.net.debug=all~ すべてのデバッグメッセージを表示します。 -javax.net.debug=ssl:handshake:data~ それぞれのハンドシェイクメッセージの 16進ダンプを表示します。 -javax.net.debug=SSL,handshake,data,trustmanager~ それぞれのハンドシェイクメッセージの 16進ダンプと、trust manager のトレースを表示します。 -https.proxyHost=xxx.xxx.xxx~ HTTPS 通信で使用するプロキシサーバのホスト名を指定します。 -https.proxyPort=nnn~ HTTPS 通信で使用するプロキシサーバのポート番号を指定します。 -javax.net.ssl.trustStore=c:\xxx\cacerts~ SSL 通信で使用する証明書ストアを指定します。~ <java-home>/lib/security/jssecacerts というファイルを作成しても可。 -java.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol~ JSSE のプロトコルハンドラを設定します。 **Swing [#k7af9dab] -Dswing.plaf.metal.controlFont=Dialog-ITALIC-18~ controlFont を設定します。 **取得/設定 [#sa7b4e3f] ***Windows で System.getProperty("user.home") を使ってログインユーザのホームディレクトリを取得すると、異なるディレクトリが返る。 [#t8f08338] Windows 版 Java では次のレジストリを検索して System Property "user.home" に値をセットしています。 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop ここに設定されている値が正しくない場合は、ログインユーザのホームディレクトリが取得できないようです。 *JWS [#oad9349c] **起動エラー [#lbecab78] ***lib/user_rule.jar がダウンロードできません、というエラーが発生し、JWS クライアントが起動できない。 [#rae47f5c] JWS はキャッシュに残っている JAR ファイルをダウンロードし直そうとするため、以前は存在した JAR ファイルが、サーバ上からなくなっていると、JAR ファイルがダウンロードできず、エラーになる。~ (例)~ java.io.IOException at sun.net.www.protocol.http.HttpURLConnection.getInputStream(UnknownSource) at com.sun.javaws.net.BasicNetworkLayer.doRequest(UnknownSource) at com.sun.javaws.net.BasicNetworkLayer.doGetRequest(UnknownSource) at com.sun.javaws.cache.DownloadProtocol.doDownload(UnknownSource) at com.sun.javaws.cache.DownloadProtocol.getResource(UnknownSource) at com.sun.javaws.LaunchDownload.downloadJarFiles(UnknownSource) at com.sun.javaws.LaunchDownload.downloadEagerorAll(UnknownSource) at com.sun.javaws.Launcher.downloadResources(UnknownSource) at com.sun.javaws.Launcher.handleApplicationDesc(UnknownSource) at com.sun.javaws.Launcher.handleLaunchFile(UnknownSource) at com.sun.javaws.Launcher.run(UnknownSource) at java.lang.Thread.run(UnknownSource) Causedby:java.io.FileNotFoundException:http://192.168.1.21/webtribe/lib/camc.jar atsun.net.www.protocol.http.HttpURLConnection.getInputStream(UnknownSource) atjava.net.HttpURLConnection.getResponseCode(UnknownSource) ...11more JNLPException[category:ダウンロードエラー:Exception:java.io.IOException:LaunchDesc:null] at com.sun.javaws.cache.DownloadProtocol.doDownload(UnknownSource) at com.sun.javaws.cache.DownloadProtocol.getResource(UnknownSource) at com.sun.javaws.LaunchDownload.downloadJarFiles(UnknownSource) at com.sun.javaws.LaunchDownload.downloadEagerorAll(UnknownSource) at com.sun.javaws.Launcher.downloadResources(UnknownSource) at com.sun.javaws.Launcher.handleApplicationDesc(UnknownSource) at com.sun.javaws.Launcher.handleLaunchFile(UnknownSource) at com.sun.javaws.Launcher.run(UnknownSource) at java.lang.Thread.run(UnknownSource) -回避策 ++クライアント PC のキャッシュをクリア。 ++JNLP ファイルから JAR の指定を除去。 ++JAR ファイルをサーバ上に配置。 ***ブラウザに JNLP ファイルの内容が表示され、JWS が起動しない。 [#e9c165f9] Apache が起動していて、Tomcat が完全に起動していない時、Content-Type がセットされない状態で応答が返ってくるため、正常に Tomcat が起動した後に送信されてくる Content-Type が正しく認識されていない可能性が考えられます。~ -解決策 ++IE のキャッシュをクリア ++IE を再起動してから JNLP にアクセスしてください ***JNLP ファイルに設定されたシステムプロパティが取得できない。 [#x2143c72] JNLP ファイルに設定するシステムプロパティは、プロパティ名が「jnlp.」、「javaws.」で始まるもの意外は無視されます。~ http://java.sun.com/j2se/1.4/ja/relnotes.html#jws ***JWSでクライアントを起動すると、存在しないJARファイルをHTTPサーバに要求する。 [#daf1a290] JARファイルに含まれる INDEX.LIST ファイルの 3行目が JARファイル名と一致していない。~ (3行目に記述されたファイルを HTTPサーバに要求して失敗する。)~ **自己署名されたJARを使って実行した時に表示される警告ダイアログで、常に信頼を選択した時、その設定が保存されるファイル [#x0b2cbc4] 下記ファイルに保存されるようです。~ ${user.home}\Application Data\Sun\Java\Deployment\security\trusted.certs **trusted.certs の初期パスワード [#u212dd20] 空文字列("")~ (例)~ keytool -list -v -keystore trusted.certs -storepass "" **JWS で実行するプログラムの標準出力を指定したファイルに出力させる。 [#xd3cbaf2] ${user.home}\Application Data\Sun\Java\Deployment\deployment.properties に次の行を追加します。~ デフォルトでは ${user.home}\Application Data\Sun\Java\Deployment\log フォルダに起動する都度個別のファイルとして出力されます。 deployment.trace=true deployment.javaws.traceFileName=c\:\\tmp\\jws.log **JDK 1.5 環境に JDK 1.6 を追加インストールした場合 [#hb6a5b33] ***cache ディレクトリ [#d8f0b9d1] JDK 1.6 を追加インストールすると、cache ディレクトリの構造が変わっています。 従来は %userprofile%\Application Data\Sun\Java\Deployment\cache\javaws\protocol\ホスト名\ポート番号\WEBコンテキスト という構造でしたが、JDK 1.6 では %userprofile%\Application Data\Sun\Java\Deployment\cache\6.0 フォルダの下に 0 ~ 63 までのフォルダが作成されています。JARファイル名も 16進数になっているため、どのファイルがダウンロードしてきた JAR ファイルかを判別することができません。 ***policytool [#y29462fd] 従来は Applet 実行した場合だけ有効だった CodeBase が JWS でも有効になっています。 これまでのように cache ディレクトリのパスを指定する必要がなくなりました。 *IBM Java [#x100c0a2] **1.4.1 [#ie318525] ***java.io.InputStream#read(byte[]) [#he5614dd] 引数に指定したバイト配列の要素数(length)が 0 の場合、JLS では 0 を返すとなっていますが、WebSphere 5.1 に付属の JDK 1.4.1 では -1 が返ってきました。 **1.5.0 [#x5741834] ***libj9thr23.so: cannot restore segment prot after reloc: Permission denied [#f143f586] SELinux が有効になっている Linux 環境で IBM JDK 1.5 を実行すると libj9thr23.so: cannot restore segment prot after reloc: Permission denied というメッセージが表示される場合は、chcon でライブラリにセキュリティコンテキストを設定します。~ 現在の設定は &color(blue){ls -lZ}; で見ることができます。~ (例) ls -lZ /usr/java/ibm-java2-i386-50/jre/bin/libj9thr23.so -rwxr-xr-x root root root:object_r:usr_t libj9thr23.so sudo chcon -c -v -R -u system_u -r object_r -t lib_t /usr/java/ibm-java2-i386-50/jre/bin ls -lZ /usr/java/ibm-java2-i386-50/jre/bin/libj9thr23.so -rwxr-xr-x root root system_u:object_r:lib_t libj9thr23.so *文法 [#id729d3a] **reflect [#hbd145e4] ***文字列からクラスのフィールドを取得。(例:"RED" という文字列から java.awt.Color.RED を取得) [#n1a58d4e] java.lang.reflect.Field red = java.awt.Color.class.getField("RED"); java.awt.Color redColor = (java.awt.Color)red.get(java.awt.Color.class); **レジストリ [#p50a6b1d] ***レジストリへの書き込みと読み込み [#b17e7439] Preferences preferences = Preferences.userNodeForPackage(this.getClass()); System.out.println(preferences.getBoolean("License", false)); preferences.putBoolean("License" , true); System.out.println(preferences.getBoolean("License", false));