通过bash脚本在Cygwin中运行JAVA

通过bash脚本在Cygwin中运行JAVA

我在 cygwin 中遇到了一个问题,无法运行 jar 文件,并出现找不到该文件的错误。

如果更容易的话,我会在 bash 中“翻译”java 源代码,但不幸的是,由于实现的功能,实现这一点存在一些相当大的障碍,所以我必须使用 jar 文件。

现在,我已经做了相当多的研究来弄清楚如何做到这一点,但是,我无法成功,并且我必须使用 cygwin。

这就是我基本上想做的事情:

lockfile="$specialfolder/$passedargument.lock
java -jar `cygpath -w ./cygdrive/driveletter/folder/folder/javafile.jar -joption cygpath -w $lockfile`

我还尝试使用双反引号,如下所示:

pathtooutfile="${some_other_vars}/${that}_${work}.out"
java -jar `cygpath -w ./cygdrive/driveletter/folder/folder/javafile.jar` -joption `cygpath -w $lockfile`

我还尝试使用 $JAVA_HOME 环境变量,但效果不佳。值得一提的是,被调用的变量锁文件var 定义如下:

 homedir= "/cygdrive/driveletter/folder/folder"
 specialfolder= "$homedir/foler/$passedargument"
 passedargument= $1 ###argument passed with execution of bash script
 lockfile= "$specialfolder/$passedargument"

我不断收到的错误是这样的:错误:无法访问 jarfile 我已经将使用权限修改为777,但也不起作用。还可能需要提及的是-j选项或者是-获取或者-发布对应于锁文件因为 jar 所做的事情之一是通过锁定文件管理多个脚本执行。我有点卡住了,所以任何建议将不胜感激。我认为这可能更多是一个 cygwin 问题。

答案1

你有没有尝试过cygpath -w -a .....

返回-a绝对路径。

例如

$ cygpath -w ./screenshot.jpg
screenshot.jpg

$ cygpath -w -a ./screenshot.jpg
C:\cygwin64\home\tony\screenshot.jpg

答案2

如果你的表情

`cygpath -w ./cygdrive/driveletter/folder/folder/javafile.jar`

嵌入了空格,您应该用双引号将其引起来,以便将结果作为单个标记传递给 Java。如果打开 shell 跟踪,可以帮助理解表达式和结果,例如set -x.

进一步阅读:

答案3

Windows 绝对路径始终以驱动器号开头,例如C:\folder1\folder2\item.ext。 Cygwin 绝对路径以 开头/- 就像所有 UNIX/Linux 文件系统一样 - 但提供一个元文件夹cygdrive,允许将不同的 Windows 驱动器号无缝映射到一个文件系统树中,例如/cygdrive/c/folder1/folder2/item.ext。 (事实上​​,我给出的两个示例文件路径对应于同一个文件系统对象。)

这里的根本问题是您的路径无效。这是一个相对路径,因为它不以 开头/,但它引用了什么好像与 Windows 驱动器号和路径相对应的绝对路径:

cygpath -w ./cygdrive/driveletter/folder/folder/javafile.jar

我想你的意思可能是这样的,没有前导点:

cygpath -w /cygdrive/driveletter/folder/folder/javafile.jar

修复引用并进行总体整理,这将使您的脚本片段看起来像这样:

lockfile="$specialfolder/$passedargument.lock"
java -jar "$(cygpath -w /cygdrive/driveletter/folder/folder/javafile.jar)" -joption "$(cygpath -w "$lockfile")"

相关内容