我知道这里有很多“无法访问jarfile”的问题,但我觉得这有点不同以保证自己的线程。
我正在编写演练,本演练的一部分涉及安装Cygwin并运行.jar文件。
问题是这个.jar文件需要从多个目录中调用,而不是让我的读者每次需要运行它时都必须输入.jar的完整路径,我希望它们只有在对Cygwin进行简单配置后输入.jar文件命令。
我尝试将PATH添加到〜/ .bashrc并尝试添加CLASSPATH,但没有成功。
每次调用java -jar file.jar
时,我都会Error: Unable to access jarfile file.jar
我该怎么做才能解决这个问题?
[编辑]
我已经和我的婆婆说过了,他对Linux有一点了解,他建议我创建一个包装器来执行jar,我有一个快速搜索,但找不到任何简单的东西。
有什么建议吗?
答案 0 :(得分:10)
Cygwin已经提供了一种在UNIX(POSIX)风格路径和Windows(MS-DOS)风格路径之间进行转换的方法,它被称为&#34; cygpath&#34;。< / p>
尝试:
java -jar `cygpath -w ./foo/bar/file.jar command file.1 file.2`
注意:这些是围绕cygpath调用的反引号。
使用cygpath消除了编写自己的bash脚本以传递内容的需要,并且jar文件可以位于计算机的任何位置。
例如,制作一个bash脚本,使用Google的Closure Compiler以与bash环境无关的方式缩小JavaScript代码:
#!/bin/bash
# Script directory
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Path to Closure Compiler
COMPILER=$HOME/archive/closure-javascript.jar
# Java requires converting paths from UNIX to Windows under Cygwin
case "$(uname -s)" in
CYGWIN*) COMPILER=$(cygpath -w $COMPILER)
esac
# Java must be in the PATH
COMMAND="java -jar $COMPILER"
# Allow overriding default filename from the command line
cd $SCRIPT_DIR
rm *.min.js > /dev/null 2>&1
# Minify all files in the directory
for js in *.js; do
$COMMAND --js=$js --js_output_file=$(basename $js .js).min.js
done
此脚本应在Cygwin和Linux下正确执行。
答案 1 :(得分:8)
java -jar file.jar仅在file.jar位于当前工作目录中时才有效。如果没有,则需要提供file.jar的路径。请注意,如果您使用的是Oracle Java,则需要注意它是一个本机Windows程序,并且不了解Cygwin的* NIX路径。
至于你的姐夫的建议,他说Java程序通常是通过* NIX平台上的包装脚本启动的。如果您使用的是Oracle Java,那将是:
#! /bin/sh
exec java -jar $(cygpath -w /path/to/file.jar) "$@"
答案 2 :(得分:1)
好的,现在已经解决了。
我设法创建了一个调用.jar及其参数的bash脚本,感谢Bernie Zimmerman's Blog我设法让它运行。
问题似乎是虽然Cygwin是一个使用Posix文件名的Linux环境,但Java仍然需要Windows文件名。
有问题的.jar有两个可能的命令,并在文件上制定这些命令并创建另一个文件。
所以我现在可以替换
java -jar ./foo/bar/file.jar command file.1 file.2
带
jar.sh command file.1 file.2
我创建的bash脚本是:
#!/bin/bash
java -jar "C:\foo\bar\file.jar" "$1" "$2" "$3"