由于jar文件,运行.sh文件时出现Cygwin终端错误

时间:2016-07-15 23:15:22

标签: java linux unix jar cygwin

我正在尝试从.sh shell脚本文件中运行我的java代码的.jar文件。 jar文件名包含"。"这让Cygwin终端认为它是一个目录。这是命令和结果:

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

结果:

  

在lib \ javax.json-1.0.jar

中没有主要清单属性

然后:

  

错误:包javax.json不存在
  import 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不存在
  import javax.json.Json; (用这个^在'。')下面   AND:
  。\ src \ TimeTester.java:159:错误:找不到符号
                    private static 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不存在
  import 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(系统找不到指定的路径)

由于

2 个答案:

答案 0 :(得分:2)

TL; DR 由于bash和{{{{}}}之间存在冲突的命令行shell约定,因此将Cygwin与为Windows编写的程序一起使用会很痛苦。 1}}。要编译和运行Java程序,最好使用Eclipse或Netbeans等IDE。

但是,如果你必须......

这一切都不起作用,因为您正在尝试将Linux样式的路径传递给Windows JVM。但是你似乎有一个更基本的误解:

cmd.exe

我猜想您认为前两个语句使编译器可以使用第三个# !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 行。事实并非如此,这两行试图执行 jar文件,当然因为jar不包含主类而失败

您应该做的是将这两个库路径作为javac命令的-cp选项的参数提供。

这是一个非常棘手的地方,因为您将Linux风格的shell模拟器与Windows JVM混合在一起。用于shell的路径必须保持Linux样式,而JVM将要使用的路径必须转换为Windows格式,JVM的路径字符串必须用分号(Windows样式)而不是冒号分隔( Linux风格)。这引入了更复杂的问题,因为Cygwin(Linux)中的分号是一行上多个命令的分隔符,因此必须引用路径字符串以防止分号破坏。

同样有问题的是要编译的类的命名。您没有向我们展示Java文件的包声明,但我假设它在默认包中(即没有包声明且它不是javac)。在这种情况下,您应该位于package src;目录中,而不是上面的一个目录。

最后,一旦指定src,您还必须将当前目录添加到Windows上的类路径中,如果您希望包含它,否则它将找不到您新编译的-cp文件。

所以编译和执行命令应该是

.class

对于简单的相对路径,Windows JVM将接受正斜杠,但如果您有绝对的Linux路径(即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 ,或者将cygdrive路径设置为/cygdrive/c/...,则路径如/ )JVM将无法理解它们,并且需要使用/c/user/...进行翻译。

答案 1 :(得分:0)

你的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