2013-05-27 35 views
6

これでわかりました:jarにライブラリを含める

私たちは2つのライブラリパッケージを用意しています。これをjarファイルにコンパイルしました。

 
package starwars; 
public class JarJar { 

    public void JarSayHello() 
    { 
     System.out.println("Jaaaaar!!"); 
    } 

} 

 
package barwars; 
public class BarBar { 

    public void BarSayHello() 
    { 
     System.out.println("Baaaaa!!"); 
    } 

} 

私たちは私たちのためにジャーにすべてうまく

 
javac -d bin -sourcepath src src/barwars/BarBar.java 
jar cvf barwars.jar -C bin . 

 
javac -d bin -sourcepath src src/starwars/JarJar.java 
jar cvf starwars.jar -C bin . 

でこれらをコンパイルします。

ここで、この2つのjarを別のJavaプロジェクトに含めることにします。

ので、我々は

  • /project/libs/barwars.jar
  • /project/libs/starwars.jar

    • /project/src/a_pack/HelloWorld.java
    • を持っています
     
    package a_pack; 
    import starwars.JarJar; 
    import barwars.BarBar; 
    
    public class HelloWorld { 
    
        public static void main(String[] args) {  
         System.out.println("Hello, World");   
         JarJar myJar = new JarJar(); 
         myJar.JarSayHello();   
         BarBar myBar = new BarBar(); 
         myBar.BarSayHello(); 
        } 
    
    } 
    

    /project/manifest.txt Manifest.txt

     
    Main-Class: a_pack.HelloWorld 
    Class-Path: libs/starwars.jar libs/barwars.jar 
    

    今、私たちは、でこれをコンパイルします。

     
    javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java 
    jar cvfm helloworld.jar manifest.txt -C bin . 
    

    そして、これはコンパイルし、罰金実行されます。

    今私には2つの問題があります。

    まず - 私はどこかに、このjarファイルを移動し、それを実行しようとした場合、その後、私は買ってあげる:

    Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar

    今、私は私が動くどこにLIBSのフォルダを移動することでこの問題を解決することができます瓶しかし、これは私に厄介なものです(既にその場所にlibsフォルダがある場合はどうでしょうか?)。

    私がやりたいことは、参照されたjarファイルをjarファイルにインクルードすることです。その内部に実行するために必要なすべてのものが入っているjarファイルが1つあります。

    これは可能ですか? (それは良い練習ですか?)

  • +2

    Mavenがこれをどのように解決するかを調べるとよいでしょう。 –

    答えて

    7

    可能です。いい練習、いいえ。

    ジャーは単なるジップファイルなので、解凍して心臓のコンテンツに復元することができます。大きな問題は、プロジェクトが大きくなるにつれて、これらの別々のjarファイルをすべて管理することです。

    ほとんどのプロジェクトは、コマンドラインを使用してコンパイルされません。代わりに、IDEはあなたのjarファイルを最新の状態に保ちます。現代のJavaプロジェクトのほとんどは、MavenやIvyを使ってjarファイルをリポジトリに配置し、必要に応じてそれらを釣り上げます。

    IDEの場合は、Eclipse、Netbeans、またはIntellijを参照してください。そしてあなたのプロジェクトを構造化するためのMavenを見てください。

    +0

    あなたの投稿をありがとう、私はそれを念頭に置くよ。 – dwjohnston

    +0

    可能であれば、どうですか?私はEclipseや他のIDEについて知っていますが、現時点では、最小限の依存関係を持つドッカーイメージ内に単一の太い.jarファイルを作成しようとしています。 'helloworld.jar'と' libs/'に外部ジャーの束があることを考えると、' helloworldwithdeps.jar'を得るために端末に書き込むものは何でしょうか? –

    +0

    また、Mavenを使ってプロジェクトを構造化し、Apache Shadeプロジェクトを見て、uber jarを作成してください。 – ccleve

    関連する問題