重写Bash脚本中的类路径以运行Java应用程序

重写Bash脚本中的类路径以运行Java应用程序,java,bash,Java,Bash,我正在尝试在Unix中运行一个简单的Java应用程序。我的Java应用程序在运行时从目录中读取配置文件。我将文件放在/tmp/paddy/中。我创建了一个简单的bash脚本来运行应用程序 我像下面这样尝试过,它给了我“没有主清单属性,在app.jar中”错误 #!/bin/bash java -cp ".:./config/*.*" -jar "app.jar" com.test.MainClass 并尝试使用下面的命令,这次我的应用程序正在运行

我正在尝试在Unix中运行一个简单的Java应用程序。我的Java应用程序在运行时从目录中读取配置文件。我将文件放在/tmp/paddy/中。我创建了一个简单的bash脚本来运行应用程序

我像下面这样尝试过,它给了我“没有主清单属性,在app.jar中”错误

#!/bin/bash    
java -cp ".:./config/*.*" -jar "app.jar" com.test.MainClass
并尝试使用下面的命令,这次我的应用程序正在运行,但找不到aconfig文件,因此它抛出我
NullPointerException
-(因为它无法加载配置文件)


Java-cp
命令中重写类路径的正确方法是什么?我在网上搜索,但找不到好的答案。我在windows中运行时没有任何问题。只有在linux中,我对linux环境非常陌生。

这里有四个不同的问题

-jar和-cp不能一起工作 如果使用-jar开关,则类路径取自jar清单中的
类路径
清单条目,而这就是将发生的一切-将完全忽略
-cp
开关(以及classpath环境变量)。解决方案是修复jarfile,它应该具有类路径条目

bash不是这样工作的。 与该问题分开,您的
-cp
参数被破坏

*.*
在。。linux。。。?那是90年代末的事,伙计

它是java解析的*,这是唯一的,因为在linux中它通常是bash解析的,但这在这里不起作用,因为bash将添加空格,java需要冒号/分号,这就是为什么java自己这么做的原因。关键是,java相当有限,只能理解一个*。哪个聚会会搞砸。所以,只有一种方法可以做到这一点

  • 单引号。
  • 一颗星。
例如:

java-cp.:./config/*'com.test.MainClass

您似乎不了解类路径是如何工作的 类路径中的每个条目必须是

  • 包含类文件的目录
  • jar文件
请注意,它不能是“包含jar文件的目录”,也不能是“类文件”;那不是一件事。*是通常的处理方式:它接受您填充的目录中的每个文件,并将它们都视为类路径的一部分

因此,如果您编写:
java-cp.
,则不包括
app.jar
。如果您编写
java-cp./config/*.
,那么它将不包括任何挂在./config上的类或配置文件(只有位于那里的jar文件)

配置文件不是这样工作的 在类路径上包含配置文件不是它的工作方式。当然可以。这没有任何作用,除非您使用
SomeClass.class.getResource
getResource
的其他变体(这些都不好,您应该使用
SomeClass.class.getResource
SomeClass.class.getresourceastream
),在这种情况下,不要这样做。这些文件不是用于配置文件,而是用于静态文件(永远不会更改的文件,例如swing用户界面应用程序的“保存到云”图标)。如果要这样做,您需要在类路径中包含
/config
(而不是
'./config/*'
),但最好修复代码

配置文件应位于用户的主目录-
System.getProperty(“user.home”)
。您应该将包含JAR文件的目录视为可执行文件生存的地方,而这些文件不一定是用户可编辑的,而且配置文件的要点当然是您可以编辑它们。因此,为什么对它们使用类路径不是这样做的

#!/bin/bash
java -cp app.jar com.test.MainClass