シェルからJavaを起動する方法

このQ&Aのポイント
  • LinuxでシェルからJavaを起動する方法をまとめます。毎回「java パッケージ名.クラス名」と入力するのが面倒な場合、シェルスクリプトを作成して一括実行することができます。
  • しかし、クラスが見つからないというエラーが発生する問題があります。このエラーは環境変数の設定によるものであり、正しく設定する必要があります。
  • この質問では、Javaの環境変数やプロジェクト固有のjarファイルなどはすでに設定済みであることが前提とされています。具体的な解決策を教えていただけると助かります。
回答を見る
  • ベストアンサー

シェルからJavaを起動したい

シェルからJavaを起動したい 上記ですけど、Linuxで毎回「java パッケージ名.クラス名」を打つのは面倒なので、 シェルスクリプトのファイルを作って、それを実行するだけで起動できるようにしようと思っています。 が、クラスが見つからないってエラーが出て実行できませんでした。 (「java パッケージ名.クラス名」を実行しているディレクトリにシェルを作ってます) 恐らく環境変数などの設定がシェルの中にいるのではないかと思いますが、 シェルスクリプトとかLinuxの環境には疎い為、どういった記述が必要なのか解りません。 どなたか例を提示して頂けないでしょうか? ちなみに、一般的なJavaの環境変数や、 プロジェクト特有・jarファイル等の環境変数は設定済みです。 それから、シェルは以下のように記述してます。 #!/bin/sh java パッケージ名.クラス名 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.2

状況が明確でないので可能性の一つというだけで役に立たないかもしれないが、 そのシェルスクリプトが存在しているディレクトリをカレントディレクトリにして、 java パッケージ名.クラス名 をコマンドラインで直接打てば動作しており、 また、そのカレントディレクトリでスクリプトを実行した場合にも実行できるが、 他のディレクトリからスクリプトを実行した場合にはクラスが見つからないというエラーになるという状況なら、 クラスパスにそのJavaクラスファイル(のトップ階層)へのパスを追加するか、 スクリプト内でカレントディレクトリを変更するかする必要がある。 例えばディレクトリ構成が、 /a/b/c/シェルスクリプトファイル /a/b/c/パッケージ名/クラス名.class になっていて、/a/b/cをカレントディレクトリにして、 java パッケージ名.クラス名 で直接実行したり、シェルスクリプトを起動した場合は実行できて、 他のディレクトリをカレントディレクトリにして実行権限をつけたシェルスクリプトを /a/b/c/シェルスクリプト や /a/b/c を検索パスに追加しているならシェルスクリプト名だけ で実行しようとした時にクラスが見つからない場合は、 #!/bin/sh java -cp /a/b/c パッケージ名.クラス名 のように/a/b/cをクラスパスに指定する。 他にもクラスパスを設定しているならそれも込みでクラスパスを設定する。 スクリプトが置かれているディレクトリがスクリプト実行時のカレントディレクトリに勝手になるわけではない。 もしくは、Javaプログラムの実行中のカレントディレクトリが、 スクリプトが置かれているディレクトリであることを前提にプログラムが作られていたりするのなら(そうでない場合でもいいが)、 javaコマンドを実行する前にカレントディレクトリを変更するようにスクリプトを書く。

yoshi5570
質問者

お礼

回答ありがとうございます。 また、こちらの少ない情報から、 色々なパターンでの提示も助かりました。 >もしくは、Javaプログラムの実行中のカレントディレクトリが、 >スクリプトが置かれているディレクトリであることを前提にプログラムが作られていたりするのなら(そうでない場合でもいいが)、 >javaコマンドを実行する前にカレントディレクトリを変更するようにスクリプトを書く。 上記のパターンで動きました! スクリプトを置いてるディレクトリで動くようにしてるんだから、 スクリプトの内容もjavaコマンドだけでいいって勘違いしてました。 アホでした。 ありがとうございました。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

パッケージ名の最上位のディレクトリに移動して java パッケージ名/クラス名 ですよ。 java パッケージ名.クラス名 ではなく、パッケージ名の階層とクラス名の区切りは.でなく/にしてみてください。

yoshi5570
質問者

お礼

回答ありがとうございました。 試してみましたが、結果は同じでした。

関連するQ&A

  • シェルからJava起動

    シェルからJavaを起動するには、 setenvでCLASSPATHを事前に設定し、 java クラス名 では実行できず、 java -classpath クラスパス クラス名 で実行するしかないのでしょうか? 以下では実行できませんでした・・ #!/usr/bin/csh setenv CLASSPATH /export/home/test/jdk13/lib/tools.jar setenv CLASSPATH /export/home/test/batch/java:${CLASSPATH} java B123

  • シェルからjavaを起動するバッチの圧縮について

    Linuxのシェルの中でjavaのクラスを起動します。その時に、引数(mainメソッドのstring args[])を渡します。 この場合、classファイルをjarにしたら引数を渡すことは可能ですか? classファイルはたくさんあるので、もし、jarファイルが無理なら他に可能な圧縮方法はあるでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 実行環境によってクラスローダーが変わる!?

    Linuxのマシンで、eclipseで実行した場合と、実行可能なJARファイルを実行した場合で、使われるクラスローダーが変わってしまい、プログラムが正常に動作しません。 eclipseから実行した場合は、"sun.misc.Launcher$AppClassLoader"が使われ。 Exportした、Runnable JAR fileを、実行した場合は"java.net.URLClassLoader"が使われます。 JARの実行はシェルにて、下記のようにしています。  export JAVA_HOME=/・・・/jdk1.6.0_30  $JAVA_HOME/jre/bin/java -jar xxxx.jar ※JAVA_HOME、CLASSPATH設定は無い状態で、シェルを実行しています。 ※JAVA_HOMEをコメントアウトしても、状況は変わりませんでした。 eclipseでは、上記シェルのJAVA_HOMEで指定したものと、ビルドパスのライブラリに指定されたものが同じパスのものであることを確認しています。 JARで実行した場合も、"sun.misc.Launcher$AppClassLoader"が使われた欲しいのですが、どうすれば良いでしょうか。 クラスローダーについて、あまり知識がなくお助けいただけないでしょうか。よろしくお願いいたします。 補足 Windows環境では、Eclipse環境でもJAR環境でも"sun.misc.Launcher$AppClassLoader"が使われ正常に動作します。 蛇足 問題個所は、Java Persistence APIのeclipselink、org.eclipse.persistence.internal.jpa.deploymentパッケージのPersistenceUnitProcessor.javaで、クラスローダーのgetResourceを使っている個所です。

  • 起動シェル内の「. 」について

    アプリケーションサーバーの起動スクリプトに以下のような記述がありました。 この記述は現在のシェルのディレクトリを取得して、環境変数を設定するしシェルを呼び出す記述だと言うのは分かるのですが、最初の「. 」ドットスペースは何をしているのでしょうか? binDir=`dirname $0` . $binDir/setupCmdLine.sh

  • Eclipseのプロジェクトをシェルで実行する方法

    Eclipseで生成したプロジェクトを以下のコマンドでシェル実行したところ、以下のエラーが出ました。 /c/Apprication/pleiades-2020-06-java-win-64bit-jre_20200702/pleiades/workspace/home/ShellTest/shell_and_Java $ ./.do-java.sh 「エラー:メイン・クラスshell_and_Java.HelloWorldが見つからなかったかロードできませんでした。」 Eclipse上のフォルダ階層は以下となっています。 ■Eclipse上のプロジェクト ShellTest (プロジェクト名) →src  (フォルダ) →→shell_and_Java (パッケージ) →→→HelloWorld.java →bin →→shell_and_Java →→→HelloWorld.class (クラスファイル) →shell_and_Java (フォルダ) →→.do-java.sh (シェルスクリプト) ■do-java.shの内容 java shell_and_Java.HelloWorld ■HelloWorld.javaの内容 printlnで"HelloWorld"を表示する単純な処理です。 環境変数やクラスパスの設定など、それぞれ正しく設定できているのか、どの状態が正しいのか分からず困っています。。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaの実行環境

    javaの勉強をしようと思い、以下のhelloworldコードを書いてみました。 public class HelloWorld { public static void main(String[] args) { System.out.print("Hello World\n"); } } それを、以下のようにlinux環境(ubuntu 10.10)でコンパイル実行しようとしたのですが、 javac HelloWorld.java java HelloWorld.class Exception in thread "main" java.lang.NoClassDefFoundError: ・・・ と怒られてしまいました。そこで色々調べて jar cvmf manifest.mf test HelloWorld.class とjarファイルを作成して実行したところ、適切に"Hello World"が表示されました。 (manifest.mfの中身は"Main-Class: HelloWorld"1行だけです。) その後、このjarファイルをwindows環境に持っていって実行したのですが、 Exception in thread "main" java.lang.NoClassDefFoundError: ・・・ と怒られてしまいました。 linux環境で、"echo $CLASSPATH"を実行しても何も表示されず、CLASSPATHはどこにも通っていないようです。 また、windows環境のDOS画面にてSETを実行し、環境変数を表示させてもCLASSPATHはありませんでした。(javaはインストール済みです。) で、質問です。 1)なぜjarにすると実行でき、classファイルのままでは実行出来なかったのでしょうか? 2)windows環境で、CLASSPATHを設定したほうが良いのでしょうか?設定する場合は、prgramfiles\java\binで良いのでしょうか? 以上、長くなり申し訳ないのですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • javaが起動しません

    http://www.java.com/ja/ というサイトに行って「無料javaのダウンロード」から ダウンロード→インストール を完了しました。 結果、現在「プログラムの追加と削除」には 「java(TM)6 Update3」というものが追加されました。 他に「java」と名の付くプログラムは見あたりません。 そして他のHPにある、javaで起動するプログラムを クリックすると 「このアプリケーションを起動できません」 というメッセージが出ます。 しかし、http://www.java.com/ja/ にある「インストール確認」で確認しますと 「Java のバージョンを確認しました。正常な設定です。 お使いのオペレーティングシステムに推奨されたバージョン (Version 6 Update 3) の Java がインストールされています。 」 というメッセージが出ます。 私の環境ですが OSはWindowsXP SP2 IEは6.0 SP2 です。 また、他のjava関連のサイトを参考に環境変数も変更しました。 変数名:PATH 変数値:C:\Program Files\Java\jre1.6.0_03\bin に変更済みです。 それからcommandで「javac」と入力しましたら 「操作可能なプログラムまたはバッチファイルとして認識されていません」 と出ます。 どのようにしたらjavaが実行出来るのでしょうか? どなたかお教え下さい。

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • シェルスクリプトファイルからjavaを実行したい

    シェルスクリプトファイル(拡張子が.shのファイル)からJavaを実行したいのですが上手くいきません。 コマンドラインで直接 cd javaのファイルが置いてあるディレクトリへのフルパス を実行した後 java 実行するクラス名 引数 とすると上手く動きます。 上記2行をshファイルにコピペしてみましたが、エラーになり動きません。 エラーは : No such file or directory cdをしている行とcdで移動しようとしているディレクトリパス Exception in thread "main" java.lang.NoClassDefFoundError: 実行するクラス shファイルの1行目に #!/bin/sh や #!/bin/bash を入れてみましたが、どちらも挙動が変わりません。(エラーのまま) shファイルはUTF-8を文字コードにして改行はLFのみです。 また、javaコマンドを実行するとき -cp や -classpath 引数でjavaのファイルが有るディレクトリを指定してみましたが挙動が変わりません。 shの実行はコマンドラインから sh shファイル(絶対パスで) source shファイル(絶対パスで) でやってみましたが駄目でした。 javaのファイルが有るディレクトリに対してパスを貼ってみましたが挙動が変わりません。 コマンドラインからコピペしてshファイルを作っていますので、フォルダ名等のつづりミスの可能性は低いと思います。 何か設定が足りないのでしょうか? よろしくお願いいたします。

  • シェルスクリプトの切り替え?

    シェルには種類がありユーザーはそれを切り替えることによって好みのシェルを自由に選択することが出来る。 というのはわかりました。 が、シェルスクリプトを記述して実行する場合はどうなんでしょう。 bornシェルで記述したシェルスクリプトをcshから実行できるのでしょうか。 実行者とスクリプト記述者が同じシェル環境で操作しないといけないのかと思い質問しています。 ひょっとして意味のわからない質問かも知れませんがお願いします。