0

私は Java プログラムを持っていて、それを Linux でコンパイルするための makefile を書きます。

このように整理された私のプロジェクト(Run.javaがメインエントリです)

Program - 
   Src - 
       (package)adb.Bing_WebResults
            Run.java
       (package)adb.jsonModel
            *.java
       (package)adb.models
            *.java
   bin - 

   lib - 
       gson.jar
       commons.jar

   resource -
       *.txt

これは私のメイクファイルです:

# My project require 3 parameters from user input.

default: Run.class
Run.class: src/adb/Bing_WebResults/Run.java
    javac -sourcepath src/ -classpath lib/*.jar -d bin/ src/adb/Bing_WebResults/*.java  src/adb/jsonModels/*.java src/adb/models/*.java


run:
    java -classpath bin/:lib/*.jar  Run  "$(ARG1)" "$(ARG2)" "$(ARG3)"

Linux の終了時に「make run」コマンドを使用すると、「メイン クラスが見つかりませんでした: Run」という例外が表示されます。

メイクファイルに何か問題がありますか? 間違ったパスか何か?

4

3 に答える 3

0

間違っている可能性のあるものはたくさんありますが、最も明らかな問題は、makefile内のターゲットの誤った依存関係です。

まず、ターゲットrunはに依存している必要がありRun.classます。その場合はmake runmakeと呼ばれるターゲットを確認しrunます。ではmakefile、このターゲットには依存関係が定義されておらずjava ...、実際にコンパイルされたクラスRun.classが存在するかどうかを確認せずに行を実行します。結果として、make runクリーンな状況から実行すると、ソースコードはコンパイルされずjava、コンパイルされたクラスが欠落しているため、コマンドは失敗します。

の依存関係defaultRun.class正しくありません。これは、作業ディレクトリではなくディレクトリにRun.class存在するためです。bin以下の行は、ターゲットについても言及してRun.classいます。

makefileを改善する方法はいくつかあります。式の繰り返しを避けるためにいくつかの変数が追加された修正コードの例を以下に示します。ただし、このアプローチはスタイルと好みの問題です。

BINDIR := bin
RUNCLASS := Run
RUNBINARY := $(BINDIR)/$(RUNCLASS).class
SRCDIR := src/adb/Bing_WebResults
RUNSRC := $(SRCDIR)/$(RUNCLASS).java

# Note: the default target below is superfluous at this moment
default: $(RUNBINARY)
$(RUNBINARY): $(RUNSRC)
        javac -sourcepath src/ -classpath lib/*.jar -d $(BINDIR) $(SRCDIR)/*.java src/adb/jsonModels/*.java src/adb/models/*.java

run: $(RUNBINARY)
        java -classpath $(BINDIR):lib/*.jar  $(RUNCLASS)  "$(ARG1)" "$(ARG2)" "$(ARG3)"

これは、単純化された同等のセットアップで私のために機能します-それはあなたのためにも機能するかもしれません。提供したスニペットを見ると、makefile正しく完了するために追加する必要のある他の依存関係または変更が存在する可能性があります。場合によっては、実行コマンドと依存関係の式にパッケージ情報を追加する必要がありますが、それはソースコードによって異なります。あなたの投稿には、完全な解決策を提供するのに十分な情報が含まれていません。

PS:このコードを自分のコードにコピーする場合は、スペースをタブに置き換えることを忘れないでくださいmakefile

于 2012-10-06T02:35:10.503 に答える
0

デフォルトパッケージにはメインクラスがないように見えるので、最後に実行時にパッケージを指定する必要があります。

java -classpath bin com.example.Run arg1 arg2 ...
于 2012-10-06T02:55:50.737 に答える
0

(1) Run はパッケージ内にあるため、makefile では「adb.Bing_WebResults.Run.class」である必要があります。

(2) 外部 jar ファイルは : で連結する必要があります (例: lib/a.jar: lib/b.jar)

于 2012-10-07T22:36:42.560 に答える