Javaのpackage機能について教えてください

このQ&Aのポイント
  • Javaのpackage機能について教えてください。
  • Javaのpackage機能を使うためには、適切なフォルダ構造を作成する必要があります。
  • また、コンパイル時にパスを指定することで、パッケージ内のクラスを使うことができます。
回答を見る
  • ベストアンサー

Java:packageについて

いつもお世話になっております。 Javaのpackage機能について教えていただけますでしょうか。 ただいまJavaの勉強中で、本を購入し、それを基にソースを書いたり動かしております。 その中にpackage機能について説明とサンプルソースがあるのですが、 本のまま書いてもエラーで動きません。本とソースを見比べても相違が見られないため 何が原因かも分からず、困っております。 内容 ・Cドライブ直下にwork3というフォルダを作成 ・work3直下にMain.javaを作成する。 ・work3の中にconverterというフォルダを作成する。 ・converterフォルダ内にDollar.javaとEuro.javaを作成する。 ・コマンドプロンプトにてc:\work3に移動し、Javac **.javaを実行後、java Mainを実行する。 コンパイルは成功し、それぞれのclassファイルは作成されております。 実行すると C:\work3>java Main Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: con verter/Main) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) 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$000(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) Could not find the main class: Main. Program will exit. とエラーが出て実行されません。 実際のソースです。 ****************** package converter; public class Dollar {  public static int toYen(int dollar){  return dollar * 90;  } } ****************** package converter; public class Euro {  public static int toYen(int euro){   return euro * 120;  } } ****************** package converter; class Main {  public static void main(String[] args){   System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");   System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");  } } ****************** ちなみにですが、3つのソースはjarファイルの実習で使用し、うまく動いてくれました。 packageの実習でpackage ***を一行追加しただけです。 よろしくお願いいたします。

  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.3

何の本で勉強してるのか、分かりませんが… (おそらくOSは関係ないとも思います。) 試しに私のPCで work3---Main.java ..| ..|-----converter-------Dollar.java ........................................| ........................................|----Euro.java このような配置で C:\work3>javac **.java (なんとかコンパイルはできたようですが…)  C:\work3>java Main 質問文と同様なエラーで実行できませんでした。 どうしてもそのような配置にして (つまり converterフォルダ内には、Dollar.java Euro.java の2つだけ   Main.java はconverterフォルダの外に配置) また、どうしても その本のような動作にしたいのなら Main.java の package converter; は消して、その代わり import を記述します。 ****************** import converter.Dollar; import converter.Euro; public class Main { public static void main(String[] args){ System.out.println("1ドルは" + Dollar.toYen(1) + "円です。"); System.out.println("1ユーロは" + Euro.toYen(1) + "円です。"); } } ****************** import で最初に パス(階層)を記述していますから、javac **.java でコンパイルで通るはずです。 これでとりあえずは その本のような C:\work3>javac **.java C:\work3>java Main 1ドルは90円です。 1ユーロは120円です。 C:\work3> (私のPCでも)このような(同じ)動作になりました。

naoggio
質問者

お礼

私のためにお手数おかけいたしまして申し訳ございませんでした。 import文は次の実習でありまして、そちらではちゃんと動いてくれました。 本は日○ソ○ト○ェアの最新Javaプログラミングという本です。 packageは一旦飛ばします。monoerezsh様に教えていただいたように packageは同階層に置いて使う importは別階層で使う という感じで次に進みたいと思います。 本当にありがとうございました。

その他の回答 (2)

回答No.2

****************** package converter; class Main {  public static void main(String[] args){   System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");   System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");  } } ****************** このソースに従うと Main.java Dollar.java Euro.java この3つを converterフォルダの中に入れて下さい。 つまり >>・work3直下にMain.javaを作成する。(←この配置が間違っています。) 次に Javac **.java で確かに(無理矢理)コンパイルは出来て classファイルは作成されますが、実際動かないでしょう。 (同じようなエラーメッセージが出ました) コマンドプロンプトにてc:\work3に移動し、javac converter/Main.java でコンパイル (これで自動的に残りのDollar.java Euro.javaがコンパイルされ、パス(階層)が通ります) java converter/Main で実行です。

naoggio
質問者

お礼

monoerezsh様の仰るやり方で動きました。ありがとうございました。 ただ、本の通りに書いても動かないのがわかりません。 今更で申し訳ございませんが、2点について本の通りってわけでは無い箇所があります。 work3---Main.java ..| ..|-----converter-------Dollar.java ........................................| ........................................|----Euro.java ディレクトリ構造は上記のように本に書いてあります(こちらは質問文と同じです) 1点目はMain.javaは実際のソースは記載されておりません。 *Dolla.javaとEuro.javaは本に書いてある通りです。 違う部分はMain.javaです。実際に書いてあるのは c:\work2\Main.javaをc:\work3フォルダにコピーし、リスト5の(1)のようにpackage文を追加する と書いてあります。 c:\work2\Main.javaとはjarファイルの実習で使用したもので、package実習にて流用するという 意味と思われます。質問に書きましたがjarファイルでは問題なく動きました。 「リスト5の(1)のように」ですが、リスト5がEuro.javaで、最初にpackage converterの一文の後に (1)が書いてあります。つまり リスト5 ****************** package converter; ・・・・・・・・・・・・(1) public class Euro { public static int toYen(int euro){ return euro * 120; } } ****************** となっております。ですので、質問文のMain.javaを書きました。 ここの部分で私が間違った解釈をしたのでしょうか。 2点目ですが、私の環境はWinXP SP3ですが、本の環境はVista SP1です。 JVMなどの実際にJavaを動かす環境は付録のCDからインストールしました。 *もちろん本に書いてある通りに行ったと思いますが・・・ また、本にコマンドプロンプト画像キャプチャがありますが、そちらは C:\work3>javac **.java C:\work3>java Main 1ドルは90円です。 1ユーロは120円です。 C:\work3> とちゃんと動いているようです。

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

java -classpath .:converter Main ではいかがでしょうか

naoggio
質問者

お礼

早速のご回答、ありがとうございます。 しかし、質問内容と同じエラーでした。

関連するQ&A

  • eclipse java oracle 接続について

    同じような質問があり、試してみたのですができませんでした 初心者なので、勉強不足だとは思っていますがどうかヨロシクお願いします Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 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 java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at Oracletest.main(Oracletest.java:11) というエラーがでています オラクルのドライバが探せていないのはわかるのですがPATHも通しているので手詰まりになってしまいました ちなみに オラクル 10g java 1.5.0_09 を使っています 詳しい設定方法を教えて下さると助かります よろしくお願いします

  • 環境変数を設定すると・・・???

    C:\Users\hop77>cd\JAVA C:\JAVA>javac Main.java C:\JAVA>java Main Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: Main has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 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) 英語は得意だったのですけれど、もう忘れました。 どうすればいいでしょうか?

    • ベストアンサー
    • Java
  • java.lang.NoClassDefFoundError。。。

    どうぞ知恵をお貸しください。 ・jdk-1.5.0.16 ・mysql-4.0.26-win32 ・mysql-connector-java-3.1.14 ・eclipse 3.2.0 をダウンロード、インストールしてjavaの勉強を行っています。 コマンドプロンプトよりコンパイルを成功した場合は実行時に下記のエラーが、 Exception in thread "main" java.lang.NoClassDefFoundError コンパイルに失敗した場合は「読み込めません」のエラーが出力されます。 環境変数でCLASSPATHも設定してありますが、あえて実行時にclasspathを指定しても試みてみましたがエラーは変わりません。 何が原因なのでしょうか? どうぞご指導をよろしくお願いします。 エラー全文 Exception in thread "main" java.lang.NoClassDefFoundError: sample (wrong name: mypackage/sample) 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.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 java.lang.ClassLoader.loadClassInternal(Unknown Source)

  • JavaでBase64をエンコード・デコード(長めです)

    初めまして。今,Javaの勉強をしています。 Base64のエンコード・デコードを行うプログラムをコマンドプロンプトでコンパイルまでは成功するのですが,いざ実行してみると >java Base64 Exception in thread "main" java.lang.NoClassDefFoundError: Base64 (wrong name: d escriber/Base64) at java.lang.ClassLoader.defineClass0(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.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 java.lang.ClassLoader.loadClassInternal(Unknown Source) というエラーがでます。 プログラムは下記のサイトを参考にさせていただきました。 http://www.ki.rim.or.jp/~kuro/Java/Etc/Etc-03-SunMisc.html クラス名とファイル名は同じはずなのですが…。 実行方法が悪いのかどうなのかわかりませんが,よろしければ指摘お願いします 。 わかりにくい文章ですみません。。

    • ベストアンサー
    • Java
  • cygwinでjavaを実行するとエラー

    cygwinでjavaを実行するとエラーになるのですが、 解決策を教えていただけないでしょうか。 こんな所で数時間も考えてしまっており、作業が滞っています。 どなたか教えていただけないでしょうか。よろしくお願い致します。 cygwin上でenvを実行した時の結果です。(一部抜粋) JAVA_HOME=/cygdrive/c/Program Files/Java/jdk1.6.0_31 CLASSPATHも設定していたのですが、HelloWorld位だったら必要ないかと思い、unsetしました。 cygwinでプロジェクト直下に移動して、 コマンド「java HelloWorld」を実行すると以下のエラーとなる。 ============================================================================= $ java HelloWorld java.lang.NoClassDefFoundError: HelloWorld at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) 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$000(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) Could not find the main class: HelloWorld. Program will exit. Exception in thread "main" ============================================================================= 因みに、ソースは以下です。 [HelloWorld.java] package co.jp.test; public class HelloWorld { public static void main(String args[]){ System.out.println("HelloWorld"); } } また、ソースをパッケージから取り出して(パッケージを削除)、 プロジェクト直下にコピーして実行するとうまくいきます。 明らかに、パッケージにあるファイルをjavaコマンドで実行する時の固有のエラーかと思うのですが、 パッケージに含まれるファイルをcygwinで実行する時に気をつけることはありますでしょうか? 因みに、ソースは以下です。 [HelloWorld.java] public class HelloWorld { public static void main(String args[]){ System.out.println("HelloWorld"); } }

    • ベストアンサー
    • Java
  • batファイルの起動について

    eclipseで作成したクラスファイルがbatで起動しません。 echo on C: cd \Documents and Settings\AAA\デスクトップ\bin\jp\co\pass java -cp Readpass pause で、作成しました。 カレントディレクトリもあっています。 起動時に、クラスパスを指定しています。 ファイル名も間違っていません。 eclipse上では起動します。 しかし、 C:\Documents and Settings\AAA\デスクトップ\bin\jp\co\pass>java Readpass Exception in thread "main" java.lang.NoClassDefFoundError: Readpass (wrong name: jp/co/pass/Readpass) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) 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$000(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) Could not find the main class: Readpass. Program will exit. と、出て起動しません。 解決方法を教えてください。

  • javaでopenglプログラムが実行できません

    お世話になります。 javaでopenglのプログラムを実行すべくjava.netのJOGLプロジェクトのページから以下をダウンロードしました。 jogl-1.1.1a-windows-i586.zip jogl-demos.zip jogl-demos-src.zip 参考サイトの指示に従って、jogl.jarを含む全ての*.jarを[JDK_HOME]\jre\lib\extにコピーし、gluegen-rt.dll,jogl.dll,jogl_awt.dll,jogl_cg.dllを[JDK_HOME]\jre\binにコピーしてインストールしましたが 以下のようにデモプログラムを実行すると以下のエラーが出て実行できません。 どこが悪いのでしょうか?よろしくお願いします。 F:\java\opengl\jogl-demos>java -cp jogl-demos.jar demos.gears.Gears Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/opengl/GLEventListener 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$000(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 java.lang.ClassLoader.loadClassInternal(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.media.opengl.GLEventListener 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 java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 12 more Could not find the main class: demos.gears.Gears. Program will exit. 参考サイト http://itpro.nikkeibp.co.jp/article/COLUMN/20060710/242865/?ST=develop

  • 沢山のエラーメッセージが表示されます。

    いつも大変お世話になり、誠にありがとうございます。 標記の件。 public class Main2 { public static void main(String[] args) { for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { System.out.println(i * j); System.out.println(" "); } System.out.println(" "); } } } C:\>cd JAVA C:\JAVA>javac Main2.java C:\JAVA>java Main2 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: Main2 has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 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) どうすればいいでしょうか? ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • 明示的にコンパイル

    java eclipse3.5を使ってプログラミングの勉強をしています。 あるプログラムを実行するために、事前にいくつかのプログラムを 明示的にコンパイルしなくてはいけないのですが、明示的にコンパイルする方法が分かりません。 あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を 選択すればよいとかかれていたのでやってみたのですが、次のような エラーが出てしまいます。 Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory 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 java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at socket_110.ThreadMain.main(ThreadMain.java:22) このエラーを取り除くには、どうすればよいのでしょうか? 分かる方お願いします。

  • 外部ライブラリについて

    Java初心者です・・。 eclipse上で、以下のソースで実行したところ、エラーになりました。 外部のライブラリを使用しているからかと思い、ビルド・パスを設定しました。 しかし・・・まだエラーが表示されます・・・。 どなたかご存知の方・・・アドバイスをお願いします。 [ソース] import javax.swing.*; import java.awt.*; class FusenExec { static public void main(String[] args) { String msg =JOptionPane.showInputDialog ("メッセージを入力して下さい。"); Dodai fusen = new Dodai(); JLabel label = new JLabel(msg); label.setOpaque(true); label.setBackground( Color.YELLOW); fusen.add(label); fusen.setSize(300, 50); fusen.setVisible(true); } } [エラー内容] Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at FusenExec.main(FusenExec.java:10)

    • ベストアンサー
    • Java