概要

JDKのインストール、Java Swingのデバッグ方法、環境変数で実行するjava.exeを切り替えるバッチファイルなどのメモの一覧です。

Ubuntu に、oracle-java8 をインストール

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo update-alternatives --config javac
  • tar.gzをダウンロードしてインストール
sudo tar zxvf jdk-8u66-linux-i586.tar.gz -C /usr/lib/jvm
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_66
export PATH=$PATH:$JAVA_HOME/bin

Swing debug agent

-gオプションを使用してコンパイル

  • NetBeansでソースにブレークポイントを設定し、Swingコンポーネントのソースにステップインすると、「変数の情報を使用できません。ソースは -gオプションを使用せずにコンパイルされています」と表示され、値は不明となる
  • javac -gオプション
    -g ローカル変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号およびソース・ファイル情報だけが生成されます。
  • java - debug jdk source can't watch variable what it is - Stack Overflowを参考に、%JAVA_HOME%/src.zip/javax/swing以下のソースをコピーし、以下のようなバッチを実行
    @echo off
    setlocal
    rem set RT_JAR=%JAVA_HOME%\jre\lib\rt.jar
    set RT_JAR=rt.jar
    dir /B /S /X src\*.java > filelist.txt
    "%JAVA_HOME%\bin\javac" -g -classpath "%RT_JAR%" -sourcepath src -d debug @filelist.txt > log.txt 2>&1
    "%JAVA_HOME%\bin\jar" cf0 rt_debug.jar debug/*
    
  • 生成されたrt_debug.jarを、%JAVA_HOME%\lib\endorsed(なければ管理者になって作成)にコピー

Javadoc 翻訳

Javadocに移動

JRuby

JRubyに移動

Java その他

Java メモ

環境変数

  • http://cr.openjdk.java.net/~gbenson/zero-08/raw_files/new/hotspot/src/share/vm/utilities/vmError.cpp
    // List of environment variables that should be reported in error log file.
    const char *env_list[] = {
      // All platforms
      "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
      "JAVA_COMPILER", "PATH", "USERNAME",
    
      // Env variables that are defined on Solaris/Linux
      "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
      "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
    
      // defined on Linux
      "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
    
      // defined on Windows
      "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
    
      (const char *)0
    };
    

コマンドプロンプトからデフォルトのロケールを変更

> javac -J-Duser.language=en Test.java
> java -Duser.language=en Test
  • 国際化についての FAQ
    アプリケーションの外部からデフォルトのロケールを設定できますか。
    
    使用している Java プラットフォームの実装によって異なります。通常、初期のデフォルトロケールは、ホストオペレーティングシステムのロケールによって決まります。Sun の JRE のバージョン 1.4 以降では、コマンド行から user.language、user.country、および user.variant の各システムプロパティを設定することで、初期のデフォルトロケールを変更できます。たとえば、初期のデフォルトロケールとして Locale("th", "TH", "TH") を選択するには、次のコマンドを使用します。
    java -Duser.language=th -Duser.country=TH -Duser.variant=TH MainClass
    
    この機能を使用できない実行環境もあるため、この機能はテスト目的だけに使用してください。

コード整形

個人的に、Javaのソースコードのインデントは、エディタでは4spaceWebサイトにソースコードを表示する場合は2spaceにしているので、xyzzyfilter-buffer(C-x #)でastyleを呼び出して以下のように整形。

astyle --style=java --mode=java --indent=spaces=2

コマンドラインなどから、ファイルを指定する場合も同様。

> astyle --style=java --mode=java --indent=spaces=4 MainPanel.java

Markdown形式のStack Overflowなどにソースコードを貼り付ける場合は、以下のようにして、行頭にタブ(またはスペース4つ)を追加。

astyle --style=java --mode=java --indent=spaces=2 < Hoge.java | sed -e "s/^\(.*\)$/\t\1/" > /dev/clipboard
astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/\t\1/"
astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/\A\(.*\)\z/    \1/"

Checkstyle(sun_checks.xml)

astyle --style=java --mode=java --indent=spaces=4 --pad-oper --pad-header --unpad-paren

キャストの後にスペースを入れる方法は?

int h = (int)(.5 + baseline / height);
//(int)の後に空白を入れたい...
int h = (int) (.5 + baseline / height);

asyle 2.04

$ astyle --version
Artistic Style Version 2.04
  • 以下の様なソースコード(最後の}の直後にEOF)をastyleで変換すると、余計な}が追加される?
class Hoge
{
    public static void main(String[] args)
    {
        System.out.println("aaaaaaa");
    }
}

ブラウザで表示されているソースコードのコピー

JavaScriptでpreタグで囲まれたソースコードをtextareaにコピーするに移動

偶数・奇数の判断

public class EvenOddTest {
  public static void main(String... args) {
    for (int i = 0; i < 5; i++) {
      if (i % 2 == 0) {
        System.out.format("%d is even%n", i);
      } else {
        System.out.format("%d is odd%n", i);
      }
      if ((i & 1) == 0) { // ビット演算子の & は、== より優先順位が低いので(i & 1)と囲む必要がある
        System.out.format("%d is even%n", i);
      } else {
        System.out.format("%d is odd%n", i);
      }
    }
  }
}

正の数と負の数を反転

public class InvertSignedNumbersTest {
  private static void print(int i) {
    System.out.println(i);
    System.out.format(" :%d\n", ~i + 1);
    System.out.format(" :%d\n", (i > 0 ? -1 : 1) * Math.abs(i));
    System.out.format(" :%d\n", ~--i);
  }
  public static void main(String... args) {
    print(256);
    print(-256);
    print(Integer.MAX_VALUE);
    print(Integer.MIN_VALUE + 1);
    print(Integer.MIN_VALUE);
  }
}

コメント