2017-04-02 6 views
0

私はマシン上にコマンドラインから実行するJavaコードをいくつか持っています。このコードから実行可能な.jarファイルを作成して、アプリケーションをより簡単に配布できるようにします。Javaコードを含む複数のフォルダを実行可能なjarファイルに変換します。

コードは、fol_a,fol_b,fol_c、およびfol_dという4つのフォルダにあります。これらのファイルのそれぞれには、.classファイルを含む/binサブフォルダが含まれており、そのうちの2つ(fol_aおよびfol_b)には/libフォルダが含まれており、コードに必要なファイル数は.jarです。

fol_dにはというパッケージ内にあるDemoという実行クラスが含まれています。クラスへのフルパスが

fol_d/bin/machineLearning/Demo 

次のように私は現在、コマンドラインからコードを実行される:<param_5>

$ cd fol_d/bin 
$ java -cp ".:../../fol_a/bin:../../fol_a/lib/*:../../fol_b/bin:../../fol_b/lib/*:../../fol_c/bin" machineLearning.Demo <param_1> <param_2> ... <param_5> 

どこ<param_1>DemoMainメソッドに与えられた引数です。私が欲しいもの

が正常Demoを実行する必要があるすべてのコード、すなわち、fol_d通じfol_aのコードが含まれている1つの.jarファイルを作成することです。私はこの.jarファイルをコマンドラインから実行して、のMainメソッドに行く引数を与えたいと考えています。このようなもの:

$ java -jar MyApplication.jar <param_1> ... <param_5> 

これは可能ですか?どうすればいい?私はオンラインで答えを見つけようとしていますが、情報の量が私を混乱させます。

更新日

右!実行するためのメインクラスを指定manifest.txtファイルを作るだけでなく、myapp

    • 新しいディレクトリへbinディレクトリの内容をコピーします。だから、私が行うために必要なすべてが、これがされたようですクラスパス
    • myapp$ jar cmf manifest.txt myapp.jar -C myapp/ .
    • jarファイルを実行します。$ java -jar myapp.jar <arg_1> <arg_2> ... <arg_n>
  • 答えて

    2

    はい、それは可能です。

    1. 使用「のcp -Rは」サブディレクトリ構造を維持し...一つのディレクトリにすべての4つのフォルダbinディレクトリをコピーします。

    2. jarコマンドを使用して、統合ディレクトリからJARファイルを作成します(インストールされていない場合は手動エントリをインストールしてください)。


    あなたがJARファイルを作成し、UPDATE、JAR内のパス(すなわち、JARファイルのインデックスに)完全修飾名を、それぞれのクラスに一致している必要があります。

    実行可能なJARを作成する場合は、メインクラス属性で完全修飾クラス名を指定する必要があります。

    JARファイルのエントリを間違って指定すると、javaのいずれかがクラスを見つけられないか、パス名とクラス名が一致しないためロードされません。

    これらの要件はすべてのJARに適用されますが、あなたのコメントから見落としたようです。

    あなたのコメントでは、あなたはfol_d.binパッケージでクラスを宣言していない限り、メインクラス属性で間違ったクラス名を使用したようです!


    ここでUPDATE 2

    は、単純なクラス名はMainで完全修飾クラス名

    package foo.bar; 
    
    public class Main { 
        ... 
    } 
    

    についての私のポイントを説明するための一例です。 完全修飾のクラス名はfoo.bar.Mainです。あなたはJARにこのクラスの「の.class」ファイルを置く場合は、クラスのためのJARファイルにパス名でなければなりません:

    /foo/bar/Main.class 
    

    パッケージ名(foo.barは)内のディレクトリパスにマップJARファイルインデックス。すなわち「/ foo/bar」である。

    JARファイルのパス名がそうでない場合、クラスローダーはそれを見つけられません。

    +0

    私はこれを試してみてくださいする前に - '男cp'は私を通知します。cpユーティリティの 「歴史のバージョンでは、-rオプションを持っていたこの実装は、そのオプションをサポートしますが、正しくコピーされません。しかし、その使用は強く、お勧めできません。特別なファイル、シンボリックリンク、またはfifoのものです。 " 私はこれについて心配すべきですか? – rdv

    +0

    代わりに-Rを使用してください。 –

    +0

    私はあなたを正しく理解しているかわかりません。私がしたことは、(1)私の4つの 'fol_'フォルダを別のフォルダ(' my_app')に入れ、(2) 'my_app'を含むフォルダにcdし、(3)そのフォルダに' manifest ( 'Main-Class:fol_d/bin/machineLearning.Demo')と(4)' jar cfm my_app.jar manifest.txt my_app'を実行します。ここまでは順調ですね。しかし、 'java -jar my_app.jar'で' my_app.jar'を実行しようとすると、 'Error:メインクラスfol_d.bin.machineLearning.Demoが見つからないかロードできませんでした。 – rdv

    関連する問題