簡體   English   中英

在Java項目中使用jar?

[英]Using a jar in a Java project?

我正在嘗試使用項目中的公共方法/類,該項目是作為jar文件(例如,稱為Hello.jar)包裝在稱為hello的程序包中的。

package hello;

public class Hello
{

 public static void main(String[] args)
 {
    coucou();
 }

 public static void coucou()
 {
   System.out.println("Hello there");
 }

}

在一個名為Tool的單獨項目中,我希望能夠調用方法Hello.coucou()因此我編寫了以下內容:

import hello.*;

public class Tool
{

 public static void main(String[] args)
 {
   System.out.println("main program running");
   Hello.coucou();

 }

}

然后使用以下命令(在Linux下)編譯Tool.java:

$ javac Tool.java -classpath .:./extern/:

Hello.jar在文件夾./extern

這似乎編譯良好,但是當我啟動它(即java工具)時,我得到了:

main program running
Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello
    at Tool.main(Tool.java:9)
Caused by: java.lang.ClassNotFoundException: hello.Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    ... 1 more

我是Java的新手(C / C ++背景),但我不明白自己在做什么錯。 有任何想法嗎?

干杯大衛


編輯:我嘗試將Hello.jar添加到命令行上的類路徑,但是我仍然遇到相同的錯誤:

$ javac Tool.java -classpath .:./extern/Hello.jar:
$ java Tool -classpath .:./extern/Hello.jar:
main program running
Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello
    at Tool.main(Tool.java:9)
Caused by: java.lang.ClassNotFoundException: hello.Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    ... 1 more

在運行以及編譯時,都需要在類路徑上輸入Hello.jar。

實際上,竅門是按照命令行中參數的順序進行的:

是最后設置了-cp(或-classpath),則它不起作用

java Tool -cp .:extern/Hello.jar

首先必須是:

java -cp .:extern/Hello.jar Tool

!!!

運行Java時,還必須添加jar文件(僅添加目錄路徑無效)。

請參閱類路徑信息。

應該是這樣的:

java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool

Java使用動態后期綁定,因此僅在確保編譯代碼正確使用其中的類時才需要將JAR放在類路徑中,但實際上並沒有像C / C ++中的鏈接程序那樣將它們嵌入到您的代碼中。 因此,在執行代碼時還需要設置類路徑。

但是,這:

$ javac Tool.java -classpath .:./extern/:

也不應該工作,因為JAR需要直接放入類路徑中,而不僅僅是它們所在的目錄:

$ javac Tool.java -classpath .:./extern/Hello.jar

最后,您將代碼放入默認的無名程序包中。 可以無所事事,但是從長遠來看會引起問題(一方面,您不能從其他任何地方的默認包中導入類)。

啟動它時,還需要在類路徑中包括Hello.jar文件。

java -cp xxx.jar hello其中xxx是要在類路徑中包含的jar,如果要多個jar,則使用;將它們分開;

卡爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM