昨日に引続き。
本日、改めて開発機の状況と原因っぽいのが明瞭になったので書いてみます。
昨日の記事に追記してもよかったのですが、少し長くなったので分けました。
開発機の状況
インストールされたJava
- (JDK 1.7.0 Update 51 32bit)
C:\Java\jdk1.7.0_51x86\bin\java.exe
- (JDK 1.7.0 Update 55 64bit)
C:\Java\jdk1.7.0_55\bin\java.exe
- (JRE 1.7.0 64bit)
C:\Program Files\Java\jre7\bin\java.exe
- (JRE 1.7.0 64bit)
C:\Windows\System32\java.exe
JDKの32bitと64bitが1つずつ、JREが1つに、コピーされたJREがSystem32
フォルダにも存在していました。
OSは64bitなのですが、32bitのJDKはSQL Developerを使うためにインストールしています。
Windows 7 Professional 64bitでのSQL Developerの設定 | Developers.IO
64bitのJDKは開発用。64bitのJREはセキュリティチェックのために最新版を維持させています。
環境変数のPath
- 標準で通している
C:\Windows\System32
のみ
自分でも驚きましたが、PC移行などを行ってから環境変数に通す作業を行っていなかったようです。
ただ、JREインストール時にSystem32
フォルダにコピーされるjava.exeがあるためjavaコマンドは実行できるようです。
batファイルからJavaコマンド実行
環境変数のPathに登録
最初の確認として、System32
フォルダ以外のjava.exeにはPathが通っていない状態です。
System32
フォルダより前にPathを読むよう先頭に3つのjava.exeがあるフォルダを1つずつ通して確認してみると、いずれもbatファイルからJavaコマンドが実行できるようになりました。
java.exeがあるフォルダで実行
次に、batファイルの冒頭でcdコマンドを使ってそれぞれのフォルダに移動してからJavaコマンドを実行してみました。
C:\Java\jdk1.7.0_51x86\bin
C:\Java\jdk1.7.0_51x86\bin>java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)
C:\Java\jdk1.7.0_55\bin
C:\Java\jdk1.7.0_55\bin>java -version java version "1.7.0_55" Java(TM) SE Runtime Environment (build 1.7.0_55-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
C:\Program Files\Java\jre7\bin
C:\Program Files\Java\jre7\bin>java -version java version "1.7.0_75" Java(TM) SE Runtime Environment (build 1.7.0_75-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
C:\Windows\System32
C:\Windows\System32>java -version 'java' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
おっとー? System32
フォルダのjava.exeがめちゃめちゃ怪しいです。
何が違うんだろうと思いながら調べてみると、set
コマンドで色々と情報が取得できることを知りました。
コマンドプロンプトからの実行とbatファイルからの実行でset
コマンドの結果を比較してみると、以下の違いがありました。
コマンドプロンプト
PROCESSOR_ARCHITECTURE=AMD64
batファイル
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=AMD64
このPROCESSOR_ARCHITECTURE
を調べてみると以下の記事を見つけました。
どうも、普通に呼び出したコマンドプロンプトとbatファイルをダブルクリックで開いたときのコマンドプロンプトはbit数が異なるようです。
じゃ、bit数が異なると何が起こるとかといいますと。
個人的な φ(`д´)メモメモ…: 64bit版のWindowsで32bitアプリケーションからsystem32ディレクトリのファイルを開けない
64bit OSで32bitのアプリケーションからSystem32
フォルダにアクセスしようとすると開けないファイルが存在するそうです。
これで、同時にMDIEから見たときにSystem32
フォルダのjava.exeが見えない原因も分かりました。地味にすっきり。MDIEは32bitアプリケーションでした。
なお、アプリケーションのbit数はタスクマネージャのプロセスで確認することができます。プロセス名の末尾に*32
がついていれば32bit、無ければ64bitです。
最後に、これで実行してみました。
C:\Windows\Sysnative
C:\Windows\Sysnative>java -version java version "1.7.0_75" Java(TM) SE Runtime Environment (build 1.7.0_75-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
はい、解決です。
今回の顛末とましては、通常は64bitで動くコマンドプロンプトがbatファイルから実行した場合には32bitで動くため、Javaの環境変数PathがSystem32
フォルダにしか通っていないとコマンドが認識できない、ということでした。
すごい勉強になりました。