【问题标题】:Cygwin terminal error in running .sh file because of a jar file由于 jar 文件,运行 .sh 文件时出现 Cygwin 终端错误
【发布时间】:2016-11-19 06:13:33
【问题描述】:

我正在尝试从 .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(系统找不到指定的路径)

谢谢

【问题讨论】:

  • 点表示 bash 中的“当前目录”。也许该脚本是要从文件系统中的特定位置运行的?您可以替换“。”如果您可以找到系统上安装 jar 文件的位置,则使用完整路径的其余部分(可能是 /cygdrive/c 或 /cygdrive/c/usr)。如果我们能看到 bash 脚本的其余部分会有所帮助。
  • @JimLewis 我已经编写了许多形式的 .sh 文件来让它运行,但它不会运行。当前是: java -jar ./lib/javax.json-1.0.jar java -jar ./lib/javax.json-api-1.0.jar cd ./src javac ./TimeTester.java java ./TimeTester 但是仍然无法测试它
  • Cygwin terminal think it is a directory 这个错误看起来更像是 java 错误而不是 cygwin 错误。
  • 我也试过了:# !bin/bash javac -cp ./lib/javax.json-api-1.0.jar:./lib/javax.json-1.0.jar ./src/TimeTester .java java -cp .:./lib/javax.json-api-1.0.jar:./lib/javax.json-1.0.jar TimeTester
  • 使用当前脚本,如果您的 TimerTester 依赖于其他 jar 文件(例如 javax.json),您需要将它们添加到类路径中(因为您的小代码在上述尝试的评论中被剪断,并且假设它们驻留在命令的目录路径中)。我建议删除中间人(脚本),直到您可以在命令行上正确运行该命令。

标签: java linux unix jar cygwin


【解决方案1】:

TL;DR 由于bashcmd.exe 之间的命令行shell 约定冲突,将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 风格的 shell 模拟器与 Windows JVM 混合在一起。用于 shell 的路径必须保持 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进行翻译。

【讨论】:

  • 谢谢!这有帮助。现在 javac 工作,但最后一个命令没有。我收到此错误:> 错误:无法找到或加载主类 TimeTester 我将更新帖子
  • 我更新了我的答案。您还需要在-cp 中包含当前目录。
  • 你太棒了!它现在可以工作了。但是在将文件路径指定为字符串时,我的代码内部出现了错误。该文件位于正确的位置,但看起来 linux 没有看到它。我的代码在 eclipde/Windows 中完美运行。这是错误:> java.io.FileNotFoundException: .\in_file\in.txt(系统找不到指定的路径)
  • 请单独提出一个问题。请务必包含指定文件路径/名称的代码,以及实际的文件路径/名称。还请记住“接受”答案,以便其他寻找相同问题的人找到。
  • 另外,请不要通过编辑您的问题来回复答案。
【解决方案2】:

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

【讨论】:

  • 非常感谢,但点 (.) 出现错误 > .\src\TimeTester.java:22: 错误:包 javax.json 不存在 > 导入 javax.json.Json ;在最后一个点(.Json)下使用这个(^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2012-04-06
  • 1970-01-01
  • 2011-02-02
  • 2019-04-29
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多