2

jGRASPを使用しているときに、パッケージ内のプログラムの出力が通常とわずかに異なることに気付きました。具体的には、プログラム名がクラスの先頭から始まる相対パスであるように見えました。

たとえば、ステートメントを含むJavaプログラムのpackage ch01.stacks;場合、コンパイル出力は次のようになります。

 javac -g ch01\stacks\ArrayStack.java

実行出力も同様に表示されます。

Notepad ++やgeditなど、ユーザーがプログラムをコンパイルするためのスクリプトを設定できる他のプログラムでこの動作をシミュレートする比較的簡単な方法があるかどうか疑問に思いました。

編集:申し訳ありませんが、私が話しているコンパイルスクリプトは、基本的にjavacに渡されるプログラムファイル名であることを忘れました。絶対パスは使用したくありません。可能な限り、スクリプトをjGRASPと同様に機能させたいと思います。

手元の問題をさらに明確にするために、現在のスクリプトでは、プログラムの現在のディレクトリでコンパイルされているため、パッケージ構造が問題を引き起こしていると思います。パッケージ構造に関してJavaプログラムを比較的コンパイルする方法を探しています。

つまり、プログラムを調べて探すことなく、コンパイルに必要な最上位ディレクトリ(前の例ではch01package )を検出する方法はありますか?

4

1 に答える 1

0

私はまだあなたが何を望んでいるのかわかりません、そしてこれはコメントに収まりません。

jGRASPの動作は正確に正常な動作です。ソースクラスとコンパイル済みクラスの両方のJavaクラスファイルは、パッケージ名を反映したファイル階層に存在します。Java IDEまたはコマンドラインビルドツール(AntMavenGradleなど)はこれを理解し、それに応じて動作します。

あなたが本当にそれらの車輪を再発明したいのなら、あなたのコードは同じことをする必要があります。Javaソースが正規のパッケージ/ファイル階層に真剣に存在しない場合は、そうです。各ファイルのpackage宣言についてソースに問い合わせ、コンパイルされ.classたファイルを適切なディレクトリに配置する必要があります。

javac-dオプションは、出力ディレクトリを設定します。コンパイルされたクラスは、パッケージ名に基づいて正しい場所に配置されます。ただし、コンパイルするときは、独自のクラスであろうと、サードパーティライブラリのクラス(通常はjar内)であろうと、すべてのインポートがクラスパスで利用可能である必要があります。

要するに:あなたが求めていることをしないでください。そうする正当な理由は考えられません。(これは、正当な理由がないという意味ではありませんが、私は...非常に懐疑的です。)makeJavaプロジェクトをビルドするために比較的正規化されたファイルを使用することも可能です。あなたが提案しているものよりも優れた解決策ですが、それでも恐ろしい考えです。

注: Javaアプリケーションを実行する場合、クラスファイルは、jar(またはwar)ファイルにパッケージ化されているか、ファイルシステムにパッケージ化されているかに関係なく、予想される階層に存在する必要があります。

于 2011-10-28T03:40:32.290 に答える