1

できるだけ簡潔にするために、これを2つの質問に分割します。少し前に私は教育目的でテキストエディタを作り始め、あちこちでそれに追加してきました。その過程で、Javaプログラムをコンパイルして実行したいと思いました。クラスを使用しJavaCompilerてコンパイルし、簡単なexec()メソッドを使用してコマンドを実行し、コンソールでプログラムを実行しました。ソースコードは、ランダムなコードの整理されていないブロックで書かれていたためか、ごちゃごちゃになっていたので、最近書き直すことにしました。プログラムを書き直しているときに、テキスト領域の下にコンソールウィンドウを追加して、コンパイラからのコンソール出力や、実行時にスローされる例外などを表示しました。

JavaCompilerからの出力またはコンソール出力を介して表示するコードを書いているときに、BufferedInputStream私はいつも同じように考えていたこれら2つのことを非常に異なる方法で行っていることに気付きました。私の最初の質問は主にあなたの意見を聞くことです、私は単純なIDEのようにJavaプログラムを実行するJavaのクラスを知らないので、コンソールコマンドを実行することが私がこれを行うために知っている唯一の方法です、同じことができますjavacコマンドを使用してコードをコンパイルするために完了しましたJavaCompiler。クラスを使用することに利点があるかどうか知りたいですか?

最後に、私はこれにいくつかのきちんとした機能を追加してきました。私はJavaプログラムをコンパイルして実行しているので、Javaプロジェクトを追跡して整理できるようにしたいと思います。特定のファイルがどのプロジェクトに属しているか、およびプロジェクト内のパッケージとディレクトリの違いを認識できるようにしたいので、パッケージフォルダー内を調べて、ソースファイルをコンパイルし、正しい実行コマンドを実行できます。バイナリフォルダからそれを実行するために、Javaはこれを行う方法を提供しますか、それともファイルから継承するがファイルのタイプ(ディレクトリまたはパッケージ)を決定するための追加のフィールドを持つカスタムクラスを作成するようなことをする必要がありますか?または、これを実装するためのより良い方法はありますか?

御時間ありがとうございます。

4

1 に答える 1

1

あなたが持っている2つの質問は密接に関係しています。メタデータから始めましょう。IDEのプロジェクトメタデータを追跡する方法を理解する最良の方法は、すでに確立されているプロジェクトがそれをどのように実行しようとしているのかを調べることです。

EclipseとNetbeansはどちらも、プロジェクトのルート内に作成されたプロジェクトフォルダーを使用して、メタデータを保持します(.settingsEclipse、.nbprojectNetbeans)。ソースフォルダ、コンパイラターゲットディレクトリ、ソースレベルなどのメタデータは、ほとんどがXMLのメタデータファイルに保持されます。

おそらく、似たようなものをたどり、/srcand/classesまたは/src/main/javaandなどの一般的なプロジェクトの原型を追加することを検討して/targetください。これは、質問の2番目の部分であるコンパイルにつながります。

Netbeans自体はコンパイラを直接使用しません。Eclipseはそうしますが、それはEclipseが独自の内部コンパイラー実装を持っており、デフォルトのコンパイラーでは利用できない追加の警告と構成を提供するためです。あなたのIDEについては、Netbeansがプロジェクトを管理してコンパイルする方法を見てみましょう。Netbeansは、を呼び出す代わりにjavac、Antと内部build.xmlファイルを使用します。Antに慣れていない場合は、Antによって解釈および実行されるタスクをXMLで設定できるツールにすぎません。たとえば、Antを使用して、Javaソースコードをコンパイルし、ドキュメントを生成し、配布JARを作成できます。これは非常に強力なツールであり、ビルドプロセス全体を一種のスクリプトとして自動化できます。

あなたはこれと同じ考えに従うことができます。IDEの新しいプロジェクトには、build.xmlデフォルトのAntターゲットを使用してプロジェクトをビルドするデフォルトのファイルがあります。からプロパティファイルにアクセスすることもできるbuild.xmlため、ソースディレクトリに関する情報を、ビルドスクリプトで使用するその他のカスタマイズ可能な情報とともにプロパティファイルに保存し、ビルドスクリプトにインポートできます。設定例を次に示します。

ファイル構造:

| Project root/
|   .myideproject/
|     build.xml
|     project.properties
|     ui.properties
|   classes/
|     <compiled .class files>
|   doc/
|     <generated javadoc files>
|   lib/
|     <3rd-party .jar files needed for compilation>
|   src/
|     <user .java files>

このbuild.xmlファイルは、IDEがコンパイルに使用するものです。ユーザーにAntのインストールを要求するか(迅速で簡単なプロセス)、Netbeansのようにバンドルすることができます(より多くの作業が必要になります)。いずれの場合もbuild.xml、ディレクトリ内にネストする.myideprojectと、ビルドファイルは次のようになります。

<project name="<User's project name>" default="compile" basedir="..">
    <!-- ... -->
</project>

2つのことに注意してください:

  1. 「ユーザーのプロジェクト名」は、ユーザーがプロジェクトを作成するときに提供されます。
  2. 「デフォルト」属性は、ビルドファイル内のターゲットを指します。
  3. 「basedir」属性は、ビルドプロセスをリベースして、ではなくプロジェクトルートのディレクトリを指すようにし.myideprojectます。

project.properties次に、ファイルをインポートする必要があります( ui.propertiesUI関連のデータを保存するためのものであり、ビルドスクリプト用ではなく、ビルドスクリプトproject.propertiesを正しく実行するために必要なすべてのものが含まれています)。これは、Antプロジェクトにプロパティをインポートする方法です。

<project ... >
    <import file=".myideproject/project.properties" />
    <!-- ... -->
</project>

project.propertiesこれにより、ディレクティブを使用してのすべてのプロパティが使用可能になります${propname}。これで、ファイル内の構成可能なディレクトリになりsrc、次のようにターゲットで使用できます。classesproject.propertiescompile

<target name="compile">
    <javac srcdir="${src}"
        destdir="${target}"
        classpath="${classpath}"
        source="${src.jdk}"
        target="${target.jdk}"
        debug="on"
        debugLevel="lines,vars,source" />
</target>

上記のターゲットの場合、プロパティファイルは次のようになります。

# delimits source directories containing .java files using ':'
src=src1:src2
# only 1 directory, it's where the .class files go
target=classes
# ':'-delimited list of jars or globs which are needed for compilation
classpath=lib/*
# Determines the -source value on the javac process
src.jdk=1.6
# Determines the -target value on the javac process
target.jdk=1.6

コメントはわかりやすくするためにあります。このプロパティファイルは、ユーザー入力を使用してIDEのUIから構築されるため、ソースフォルダーを追加または削除するsrcと、プロパティファイルの値が自動的に変更され、プロセスを再構築できます。

これはあなたが始めるのに十分なはずです。考慮すべきいくつかの事柄:

  • メインメソッドに使用するクラスを指定するために、IDEによって設定されたプロパティとともにタスクrunを使用するターゲットが必要になります。java
  • ユーザーが依存関係を自動的に解決するのに役立つMavenプロジェクトのサポートも検討することをお勧めします。これはあなたにとってはるかに多くの作業になるでしょう、そしてあなたはおそらくあなたがAntサポートを完了するまで待つべきです
  • standard-out / err/inをAntプロセスからユーザーが操作できるものにリダイレクトする必要があります。標準入力をサポートする必要はありませんが、少なくとも標準出力/エラーをサポートする必要があります

コメントごとの最後のコメント:ビューを作成するためにJTree拡張するカスタムノードクラスでを使用するDefaultMutableTreeNode必要がありますが、プロジェクトのビューだけでなく、ファイル構造のビューである必要はありません。だから多分それは次のようなものかもしれません:

+ Project 1 Name
| + Source Folder 1
|     <.java files>
| + Source Folder 2
|     <.java files>
| + Source Folder 3
|     <.java files>
+ Project 2 Name
| + Source Folder 1
|     <.java files>
| + Source Folder 2
|     <.java files>
| + Source Folder 3
|     <.java files>

構造はファイルシステムに基づくことができますが、ソースディレクトリなど、ユーザーが必要とする情報のみを表示します。そこからそのアイデアを拡張できます。

頑張って、面白いプロジェクトのようですね。うまくいけば、私の提案がある程度意味をなし、あなたを助けることができます。何か説明が必要な場合はお知らせください。

于 2013-01-15T20:02:40.373 に答える