ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

gnupack の CygWin で Java が上手いこと動かなかった

gnupackのcygwinがWindowsのpathを拾ってくれない件 - モーグルとカバとパウダーの日記

ありがとう、ありがとう。

    GNUPACK_PATH = %EMACS_DIR%\bin;%INST_DIR%\app\vim;%INST_DIR%\app\script
    GNUPACK_PATH = %GNUPACK_PATH%;%INST_DIR%\app\mingw\tdm\bin;%_local_%\bin;%CYGWIN_DIR%\bin
    PATH = %GNUPACK_PATH%;%PATH%

上のブログのおかげで、Javaがgnupackに搭載されているバージョンで動くのでなく、
WindowsのPATHで通してあるところで動くようになりました。

何がヤバイって、gnupack の cygwin の binフォルダを見ても java.exe がないから
いったいどこを起点にJavaが動いてるのか謎すぎるし、
そのうえその搭載されているJavaがどうおかしいのかわかんないけど、
ふつうのJavaプログラムが実行できないことだったんですよね。

なんとかなって心に余裕が出来たので改めて調べてみると、原因はわかりました。
gnupack の startup_config.ini 内の

    PATH = %PATH%;  %windir%\system32;  %windir%;  %windir%\system32\Wbem

この一文、こいつが原因です。(※見やすいようにセミコロンの後ろにスペースを2つ足しました)
%windir%\system32 内に java.exe があるので、そいつが動いちゃってたんですね。コノヤロー!
というわけで、この一文の最初に#を付けてコメント化(コメントアウト)させちゃえばもう心配ないですね。

コメントアウトさせたことで、上記のブログのような記述は必要なくなりましたが、
今度は代わりに
PATH = %PATH%;C:\Java\jdk1.8.0_40\bin
の一行を書いておかないと、WindowsのPATHが書いてあってもJavaが動かないので注意と。

 

以下、どんなおかしなことが起こっていたのか参考に。
(原因がわかってから見れば、javac.exe は %windir%\system32 内に無いので、
PATHを通しているv1.8.0_40 でコンパイルをおこなっていて、
java.exe は %windir%\system32 内の v1.7.0_71 の方が起動するために
バージョン違いによりエラーが起こっていた、ということなのですね…)

 # # cat HelloJava.java
public class HelloJava {
    public static void main(String [] args){
        System.out.println("Hello!! You!!") ;
        System.out.println("Hey!") ;
    }
}

 # # java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) Client VM (build 24.71-b01, mixed mode, sharing)
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

 # # javac HelloJava.java
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

 # # java HelloJava
java.lang.UnsupportedClassVersionError: HelloJava : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Exception in thread "main"