簡體   English   中英

由於jar文件,運行.sh文件的Cygwin終端錯誤

[英]Cygwin terminal error in running .sh file because of a jar file

我正在嘗試從.sh shell腳本文件為Java代碼運行.jar文件。 jar文件名包含“。” 使Cygwin終端認為它是目錄。 這是命令和結果:

java -jar ./lib/javax.json-1.0.jar

結果:

lib \\ javax.json-1.0.jar中沒有主清單屬性

然后:

錯誤:程序包javax.json不存在
導入javax.json.Json;

在句點下(在javax之后)帶有此標記^。

我該如何解決? 我正在Windows 10上工作。謝謝!

編輯:
我已經編寫了多種形式的.sh文件來運行它,但是它不會運行。 當前的是:

# !bin/bash  
java -jar ./lib/javax.json-1.0.jar  
java -jar ./lib/javax.json-api-1.0.jar  
javac ./src/TimeTester.java  
java TimeTester  

這樣看起來好嗎?
我收到以下錯誤:

。\\ src \\ TimeTester.java:22:錯誤:軟件包javax.json不存在
導入javax.json.Json; (在“。”下的此^)
和:
。\\ src \\ TimeTester.java:159:錯誤:找不到符號
私有靜態JsonObject getJsonFromString(String jsonStr){

錯誤中還有許多類似的行..有幫助嗎?

編輯2:
這是我當前的文件:

javac -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar ./src/TimeTester.java  
java -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar:./src TimeTester  

但我得到:

。\\ src \\ TimeTester.java:22:錯誤:軟件包javax.json不存在
導入javax.json.Json;
^

與最后一個點(.Json)下的(^)

編輯3:
當前的.sh文件是:

#!/usr/bin/env bash  
cd src  
javac -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester.java  
java -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester  

第一個命令(javac)工作並生成.class文件。 但是,第二個命令(java)不起作用,並且出現以下錯誤:

錯誤:找不到或加載主類TimeTester

非常感謝您的幫助!

最終編輯:
感謝Jim,shell腳本現在可以使用了。 現在我收到一個Java執行錯誤:

java.io.FileNotFoundException:。\\ in_input \\ in.txt(系統找不到指定的路徑)

謝謝

TL; DR由於Cybwin與bashcmd.exe之間的命令行外殼約定沖突,因此很難將Cygwin與為Windows編寫的程序一起使用。 要編譯和運行Java程序,最好使用Eclipse或Netbeans之類的IDE。

但是,如果您必須...

這些都不起作用,因為您試圖將Linux樣式的路徑傳遞給Windows JVM。 但是,您似乎有一個更基本的誤解:

# !bin/bash  
java -jar ./lib/javax.json-1.0.jar  
java -jar ./lib/javax.json-api-1.0.jar  
javac ./src/TimeTester.java  
java TimeTester  

我推測您認為前兩個語句使庫可用於第三javac行的編譯器。 這是不正確的,這兩行嘗試執行 jar文件,因為jar不包含主類,所以這當然會失敗

您應該做的是提供這兩個庫路徑作為javac命令的-cp選項的參數。

這是非常棘手的地方,因為您將Linux樣式的外殼仿真器與Windows JVM混合使用。 用於外殼程序的路徑必須保持Linux樣式,而將由JVM使用的路徑必須轉換為Windows格式,並且JVM的路徑字符串必須用分號(Windows樣式)而不是冒號( Linux樣式)。 由於Cygwin(Linux)中的分號是一行上多個命令的定界符,因此這會帶來進一步的復雜性,因此必須用引號引起來以防止分號破壞內容。

還有一個問題是要編譯的類的命名。 您沒有向我們顯示Java文件的軟件包聲明,但是我假設它在默認軟件包中(即,沒有軟件包聲明,也不是package src; )。 在這種情況下,您應該位於src目錄中,而不是上面的目錄中。

最后,一旦指定了-cp ,還必須將當前目錄添加到Windows上的類路徑中,如果要包含它,否則它將找不到您新編譯的.class文件。

所以編譯和執行命令應該是

javac -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester.java
java -cp '.;../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester

對於簡單的相對路徑,Windows JVM將接受正斜杠,但是如果您具有絕對的Linux路徑(即/cygdrive/c/...或cygdrive路徑設置為/ ,則路徑應為/c/user/... ) JVM無法理解它們,因此需要使用cygpath對其進行翻譯。

您的4個命令都不起作用:

  • java -jar ./lib/javax.json-1.0.jar無效,因為javax.json-1.0.jar不是可執行的jar文件。

  • java -jar ./lib/javax.json-api-1.0.jar無效,因為javax.json-api-1.0.jar不是可執行的jar文件。

  • javac ./src/TimeTester.java不起作用,因為您的類要求javax.json包中的類位於類路徑上,並且您尚未設置類路徑。 javax.json包中的類位於javax.json-1.0.jar文件中。

  • java TimeTester不起作用,因為編譯失敗。

要解決所有問題,請刪除前兩行,並在其他兩行上指定類路徑,例如

javac -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar ./src/TimeTester.java
java -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar:./src TimeTester

請注意,執行程序時,還必須在類路徑上列出./src

暫無
暫無

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

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