9

我知道这里有很多“无法访问 jarfile”的问题,但我确实觉得这足以保证它自己的线程。

我正在写一个演练,这个演练的一部分涉及安装 Cygwin 和运行一个 .jar 文件。

问题是这个 .jar 文件需要从多个目录中调用,而不是让我的读者每次需要运行它时都必须输入 .jar 的完整路径,我希望他们只需要输入对 Cygwin 进行简单配置后的 .jar 文件命令。

我尝试将 PATH 添加到 ~/.bashrc 并尝试添加 CLASSPATH,但没有成功。

每次我调用java -jar file.jar我都会得到Error: Unable to access jarfile file.jar

我应该怎么做才能解决这个问题?

[编辑]

我和我的姐夫谈过,他对 Linux 有一点了解,他建议我创建一个包装器来执行 jar,我进行了快速搜索,但找不到任何简单的东西。

有什么建议么?

4

3 回答 3

13

Cygwin 已经提供了一种在 UNIX (POSIX) 风格的路径和 Windows (MS-DOS) 风格的路径之间进行转换的方法,它被称为“ cygpath ”。

尝试:

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 下正确执行。

于 2015-10-23T20:13:22.013 回答
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) "$@"
于 2013-05-19T23:14:51.290 回答
1

好的,现在已经解决了。

我设法创建了一个调用 .jar 及其参数的 bash 脚本,并且感谢Bernie Zimmerman 的博客,我设法让它运行。

问题似乎是,虽然 Cygwin 是使用 Posix 文件名的 Linux 环境,但 Java 仍然需要 Windows 文件名。

有问题的 .jar 有 2 个可能的命令,并在一个文件上执行这些命令并创建另一个文件。

所以我现在可以替换

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"

于 2013-05-19T23:19:50.290 回答