首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于jar文件在运行.sh文件时出现Cygwin终端错误

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

Stack Overflow用户
提问于 2016-07-15 23:15:22
回答 2查看 738关注 0票数 0

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

代码语言:javascript
运行
复制
java -jar ./lib/javax.json-1.0.jar

结果:

没有主清单属性,在lib\javax.json-1.0.jar中

然后:

错误:包javax.json不存在 进口javax.json.Json;

使用此标记^低于句点(就在javax之后)。

我该怎么解决呢?我正在Windows 10上工作。谢谢!

编辑:

我已经编写了许多形式的.sh文件来让它运行,但是它不会运行。目前的情况是:

代码语言:javascript
运行
复制
# !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:

这是我的当前文件:

代码语言:javascript
运行
复制
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文件是:

代码语言:javascript
运行
复制
#!/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 (系统找不到指定的路径)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-16 01:40:57

TL;博士由于bashcmd.exe之间的命令行shell约定相互冲突,在为cmd.exe编写的程序中使用Cygwin是件很痛苦的事情。要编译和运行Java程序,最好使用IDE,如Eclipse或Netbeans。

但是如果你必须..。

所有这些都不起作用,因为您试图将Linux样式的路径传递给Windows。然而,你似乎有一个更基本的误解:

代码语言:javascript
运行
复制
# !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不包含主类,jar将失败。

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

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

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

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

因此,编译和执行命令应该是

代码语言:javascript
运行
复制
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将接受正斜杠,但如果您拥有绝对的Linux路径(即/cygdrive/c/...,或者将cygdrive路径设置为/,则路径设置为/c/user/...),则JVM将无法理解它们,因此需要使用cygpath进行转换。

票数 2
EN

Stack Overflow用户

发布于 2016-07-16 00:49:44

您的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无法工作。

要解决所有这些问题,请删除前两行,并在其他两行上指定类路径。

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38406197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档