【问题标题】:.jar file not running with arguments.jar 文件未使用参数运行
【发布时间】:2018-11-04 14:32:43
【问题描述】:

我正在尝试通过命令在 Windows 上运行一个 .jar 文件(名为 MC),我正在使用以下代码:

java -jar MC.jar 

这行得通,该文件有一个弹出的 UI,我可以在那里手动更改一些参数。

然而,我想运行这个 .jar 文件不弹出 UI,并通过命令行设置参数。该文件附带有关如何更改每个参数的说明。这是一个例子:

java -jar MC.jar bB 0.004

当我尝试从命令行运行它时,我收到以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at CellSim.main(CellSim.java:113)

我不知道出了什么问题。我应该提到我不知道如何用 Java 编码,所以我没有看过源代码(这对我来说毫无意义)。我只需要重复运行这个 .jar 文件并使用它的输出(很多 .csv 文件)。

我还应该提到相同的 .jar 文件已在 Mac 和其他 Windows 机器上成功使用,所以这让我觉得这是我的 PC 特有的东西。

这是我在我的 Windows PC 上安装的: java版本“1.8.0_191” Java(TM) SE 运行时环境 (build 1.8.0_191-b12) Java HotSpot(TM) Client VM(build 25.191-b12,混合模式,共享)

这是我在我的 Mac 上安装的: java版本“1.8.0_25” Java(TM) SE 运行时环境 (build 1.8.0_25-b17) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.25-b02,混合模式)

请帮忙!在过去的 3 个小时里,我一直在互联网上寻找解决方法。

您可以下载.jar文件here

在下面的图片中,有更多关于可以更改的参数的详细信息。请注意,我已将文件重命名为 MC.jar。 Details about the .jar file Complete list of parameters

【问题讨论】:

  • 向我们展示您的代码!如果你不能改变它,那么你就不能改变它处理命令行参数的方式。
  • 我已经提供了这个文件。我能够从命令行(在我的 Mac 上)更改参数,所以我认为代码没有问题。也许我需要在我的电脑上安装一些东西?
  • “该文件附带有关如何更改每个参数的说明” - 如果您也提供这些说明会很有帮助
  • 您的 Mac 是否也出现了同样的问题?
  • 不,它在 Mac 上按预期工作。

标签: java jar


【解决方案1】:

有两种可能的原因/情况:

  • 属性未传递到应用程序中(据我了解,您对此有疑问)

  • 只有在参数确实正确传递时才会执行的代码中会发生一些外部事件

如果jar创建正确,传递参数的方法是正确的,你可以确定。

为了检查自己和练习(我知道这是一个“学生”问题),您可以在 main 方法中循环打印 while args 数组:

public static void main(String [] args) {
    for(String arg : args) {
       System.out.println(arg);
    }  

    // now do your logic here      
}

您可能会看到正确打印的参数

所以这可能是第二种情况,您必须调试并检查那里发生了什么

【讨论】:

  • 谢谢你的建议,马克。这可能行得通,但是,鉴于我缺乏 Java 编程知识,调试它就像尝试阅读中文一样。
  • 时间充裕,我对此毫无疑问。我的日程安排很紧,我想让它今天开始工作。我对来自这个文件的数据比对代码本身更感兴趣。
【解决方案2】:

问题似乎在于它创建输出目录的方式。

这是jar文件的反编译代码片段,

尽管有操作系统,变量path 获取一个使用“/”作为分隔符的值。

例如:路径 = /C:/mydir/MC.jar

由于 File.separator 在 Windows 中是 '\',它尝试使用 '\' 进行子字符串化,导致第 113 行出现异常,因为它在路径中找不到任何出现的 '\'。

所以底线:如果不对代码进行任何修改,jar 文件只会在 Mac/Linux 中带参数运行。

【讨论】:

  • 这里出了点问题,“getPath”在windows上返回一个带有“\”(即反斜杠)分隔符的路径
  • 感谢您深入了解它。我今天将无法修改代码,因为我需要真正学习如何用 Java 编写代码。但是,在时机成熟时知道我必须做什么当然很有用。
  • @mangusta 我在 Windows 上运行 getPath(),在 Windows 上得到“/”。
  • "getLocation" 在这里没有引起我的注意。它返回一个“URL”对象,并且在 URL 上调用的“getPath”将只包含斜杠,无论操作系统是什么。文件对象上调用的“getPath”将包含斜杠和反斜杠,具体取决于操作系统
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 2017-05-21
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多