java在所选路径中找到分号_将所有jar包含在Java类路径中的目录中

basszero..

1113

使用Java 6或更高版本,classpath选项支持通配符.请注意以下事项:

使用直引号(")

使用*,而不是*.jar

视窗

java -cp "Test.jar;lib/*" my.package.MainClass

Unix的

java -cp "Test.jar:lib/*" my.package.MainClass

这类似于Windows,但使用:而不是;.如果您不能使用通配符,则bash允许以下语法(其中lib包含所有Java归档文件的目录):

java -cp $(echo lib/*.jar | tr ' ' ':')

(请注意,使用类路径与-jar选项不兼容.另请参阅:从命令提示符执行带有多个类路径库的jar文件)

了解通配符

类路径条目可以包含基本名称通配符*,该字符被认为等同于指定具有扩展名.jar或目录的目录中的所有文件的列表.JAR.例如,类路径条目foo/*指定名为foo的目录中的所有JAR文件.一个只包含的类路径条目*扩展为当前目录中所有jar文件的列表.

包含的类路径条目*与类文件不匹配.要在单个目录foo中匹配类和JAR文件,请使用

foo;foo/*或foo/*;foo.选择的顺序确定是否foo在JAR文件之前加载类和资源,foo反之亦然.

不会递归搜索子目录.例如,foo/*仅在查找JAR文件foo,而不是在foo/bar,foo/baz等

未指定在扩展类路径中枚举目录中的JAR文件的顺序,并且可能因平台而异,甚至在同一台机器上不时.构造良好的应用程序不应该依赖于任何特定的顺序.如果需要特定顺序,则可以在类路径中显式枚举JAR文件.

在类加载过程本身期间,在调用程序的main方法之前,而不是迟到,扩展通配符是在早期完成的.包含通配符的输入类路径的每个元素都由枚举命名目录中的JAR文件生成的(可能为空)元素序列替换.例如,如果目录foo包含a.jar,b.jar和c.jar,则将类路径foo/*扩展为foo/a.jar;foo/b.jar;foo/c.jar,并且该字符串将是系统属性的值

java.class.path.

在CLASSPATH环境变量未从处理过的任何不同的-classpath(或-cp)的命令行选项.也就是说,在所有这些情况下,通配符都很荣幸.但是,Class-Path jar-manifest标题中不支持类路径通配符.

注意:由于java 8中的已知错误,windows示例必须使用带有尾随星号的条目前面的反斜杠:https://bugs.openjdk.java.net/browse/JDK-8131329

也不要在-cp中使用`~` (3认同)

该特征记录很少,并且似乎需要满足一些不太明显的前提条件才能按预期工作. (2认同)

davorp..

221

在Windows下,这工作:

java -cp "Test.jar;lib/*" my.package.MainClass

这不起作用:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

注意*.jar,所以*通配符应该单独使用.

在Linux上,以下工作:

java -cp "Test.jar:lib/*" my.package.MainClass

分隔符是冒号而不是分号.

完美的答案.需要注意的两件重要事项:1)使用引号和2)仅使用*,而不是*.jar (17认同)

一年零8个月之后,我所做的编辑包括UNIX版本再次保存了我.:)有趣的是如何用`*.jar`识别我的jar文件,但只能用`*`. (4认同)

第三个例子适用于Linux(Ubuntu 12.04 LTS). (3认同)

oxbow_lakes..

65

我们通过部署一个主 jar文件解决了这个问题,该文件myapp.jar包含一个manifest(Manifest.mf)文件,该文件指定了一个带有其他所需jar的类路径,然后将其与它一起部署.在这种情况下,您只需要java -jar myapp.jar在运行代码时声明.

因此,如果将main部署jar到某个目录中,然后将依赖的jar放入其lib下的文件夹中,则清单如下所示:

Manifest-Version: 1.0

Implementation-Title: myapp

Implementation-Version: 1.0.1

Class-Path: lib/dep1.jar lib/dep2.jar

注意:这是独立于平台的 - 我们可以使用相同的jar在UNIX服务器或Windows PC上启动.

oxbow_lakes的答案并不完全正确; 如果你用java -jar myapp.jar启动这个jar,那么Class-Path的东西很荣幸(并且只有被尊重; -cp/-classpath被忽略!).我认为oxbow_lakes的意思是当他写'java -classpath myapp.jar'时写的. (6认同)

Habi..

46

我的解决方案在Ubuntu 10.04上使用java-sun 1.6.0_24,所有jar都在"lib"目录中:

java -cp .:lib/* my.main.Class

如果失败,则以下命令应该有效(将lib目录中的所有*.jars打印到classpath参数)

java -cp $(for i in lib/*.jar ; do echo -n $i: ; done). my.main.Class

一个有趣的笔记.java -cp lib/*my.main.Class总是失败因为lib/*的shell glob扩展,而java -cp.:lib/*my.main.Class不会因为.:lib/*不是有效的glob路径.花点时间注意一下 (4认同)

Pops..

35

简短回答: java -classpath lib/*:. my.package.Program

Oracle提供了有关在类路径中使用通配符的文档,这些通配符用于Java 6,此处用于Java 7,在标题" 理解类路径通配符 "一节中.(在我写这篇文章时,这两个页面包含相同的信息.)以下是重点摘要:

通常,要在给定目录中包含所有JAR,可以使用通配符*(不是 *.jar).

通配符仅匹配JAR,而不匹配类文件; 要获取目录中的所有类,只需在目录名称处结束类路径条目.

可以组合上述两个选项以包括目录中的所有JAR和类文件,并应用通常的类路径优先级规则.例如-cp /classes;/jars/*

通配符不会在子目录中搜索JAR.

如果使用CLASSPATH系统属性-cp或-classpath命令行标志,则上述要点为true .但是,如果使用Class-PathJAR清单标头(就像使用ant构建文件一样),则不会遵循通配符.

是的,我的第一个链接与得分最高的答案中提供的链接相同(我没有超车的希望),但这个答案并没有提供超出链接的解释.由于这些天 Stack Upflow 不鼓励这种行为,我想我会扩展它.

SANN3..

34

对我来说,这适用于Windows.

java -cp "/lib/*;" sample

对于Linux

java -cp "/lib/*:" sample

Wender..

30

Windows:

java -cp file.jar; dir/*my.app.ClassName

Linux:

java -cp file.jar:dir/*my.app.ClassName

提醒:

- Windows路径分隔符是" ; "

- Linux路径分隔符是" : "

- 在Windows中,如果cp参数不包含空格,则"引号"是可选的

Navi..

27

运行java时外部jar的目录

java.ext.dirs与classpath中的普通jar有很大的不同.它具有更高的优先级和权限,可以以某种方式覆盖bootstamp中的类(rt.jar) (5认同)

这可行,但请注意,传递`-Djava.ext.dirs =`BEFORE` -jar` (3认同)

rvernica..

22

正确:

java -classpath "lib/*:." my.package.Program

不正确:

java -classpath "lib/a*.jar:." my.package.Program

java -classpath "lib/a*:." my.package.Program

java -classpath "lib/*.jar:." my.package.Program

java -classpath lib/*:. my.package.Program

小智..

9

如果您确实需要动态指定所有.jar文件,则可以使用shell脚本或Apache Ant.有一个名为Commons Launcher的公共项目,它基本上允许您将启动脚本指定为ant构建文件(如果您看到我的意思).

然后,您可以指定以下内容:

在启动构建文件中,该文件将使用正确的类路径启动应用程序.

小智..

9

如果您使用的是Java 6,则可以在类路径中使用通配符.

现在可以在类路径定义中使用通配符:

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java -d build/classes

Jake Toronto..

8

请注意,Windows上的Java 7通配符扩展已中断.

解决方法是在通配符后面加上分号. java -cp "somewhere/*;"

Evgeni Serge..

6

敬启者,

我在MSYS/MinGW shell下的Windows上发现了这种奇怪的行为.

作品:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

不起作用:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java

javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar

Usage: javac

use -help for a list of possible options

我很确定shell不会扩展通配符,因为例如

$ echo './*'

./*

(尝试使用其他程序,而不是内置程序,echo结果相同.)

我相信它javac正试图扩展它,并且无论论证中是否有分号,它的行为都不同.首先,它可能试图扩展看起来像路径的所有参数.只有这样它才能解析它们,-cp只需要使用以下标记.(注意那com.comsol.aco_1.0.0.jar是该目录中的第二个JAR.)这都是猜测.

这是

$ javac -version

javac 1.7.0

realPK..

5

如果您在Eclipse或Netbeans之类的任何IDE之外开发和运行Java应用程序,那么上述所有解决方案都将非常有用。

如果您使用的是Windows 7并且使用Java的Eclipse IDE进行开发,则在使用命令提示符运行Eclipse内置的类文件时,可能会遇到问题。

例如,您在Eclipse中的源代码具有以下程序包层次结构:edu.sjsu.myapp.Main.java

您将json.jar作为Main.java的外部依赖项

当您尝试从Eclipse中运行Main.java时,它将正常运行。

但是,当您在Eclipse中编译Main.java之后尝试使用命令提示符运行此命令时,它将发出一些奇怪的错误,提示“ ClassNotDef错误等等”。

我假设您在源代码的工作目录中!

使用以下语法从命令提示符运行它:

javac -cp “。; json.jar” Main.java

java -cp “。; json.jar” edu.sjsu.myapp.Main

[不要错过。以上]

这是因为您已将Main.java放在edu.sjsu.myapp包中,而java.exe会查找确切的模式。

希望能帮助到你 !!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,当你想要使用`-jar`选项运行一个JAR文件,并且这个JAR文件依赖于外部的其他JAR文件时,你需要正确配置路径(Classpath)以便找到这些外部依赖。`-jar`选项直接执行JAR文件内的main方法,所以如果你的JAR里有对其他JAR的依赖,你需要将这些依赖的路径添加到启动命令。 以下是基本的步骤: 1. **包所有依赖的JARs**:确保所有的外部JAR文件都在项目的根目录下或者与主JAR放在同一个目录结构下。这样,它们会被默认地包路径。 2. **使用绝对路径**:如果你的外部JAR位于不同目录,使用绝对路径指定,例如: ```sh java -jar myMainJar.jar -Djava.class.path=path/to/dependency1.jar:path/to/dependency2.jar ``` 或者,你可以用分号在Windows系统: ```sh java -jar myMainJar.jar -Djava.class.path=path\to\dependency1.jar;path\to\dependency2.jar ``` 3. **使用路径变量**:如果你想让这个设置在每次运行时都生效,可以将路径添加到系统的环境变量`CLASSPATH`里,或者创建一个`.java.opts`文件在JDK安装目录下(如`JAVA_HOME/bin`),里面写上路径。 4. **使用`--add-modules`或`--add-opens`**:如果外部JAR是模块化的(Java 9及以上版本),可能还需要指定`--add-modules`或`--add-opens`来开启特定模块。 5. **注意路径分隔符**:跨平台情况下,路径分隔符可能会有所不同,确保正确匹配你的操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值