Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 启动应用程序时排除类路径内的类或包_Java_Classpath - Fatal编程技术网

Java 启动应用程序时排除类路径内的类或包

Java 启动应用程序时排除类路径内的类或包,java,classpath,Java,Classpath,我在一个文件夹中有多个*.jar文件,这些文件都包含在类路径中,以便在Microsoft Windows操作系统中启动指定的主类。目前,这是这样完成的: @echo off java -Xmx1024M -cp libs/*;. org.test.Main 现在我遇到了一个问题,在libs文件夹中有两个JAR文件,它们都有一个相同的包org.test.configuration。两者都不同,当我现在启动程序时,会出现错误,因为Java虚拟机选择了错误的一个 如何在开始脚本中排除一个特殊包或一个

我在一个文件夹中有多个
*.jar
文件,这些文件都包含在类路径中,以便在Microsoft Windows操作系统中启动指定的主类。目前,这是这样完成的:

@echo off
java -Xmx1024M -cp libs/*;. org.test.Main
现在我遇到了一个问题,在
libs
文件夹中有两个JAR文件,它们都有一个相同的包
org.test.configuration
。两者都不同,当我现在启动程序时,会出现错误,因为Java虚拟机选择了错误的一个


如何在开始脚本中排除一个特殊包或一个特殊类?(当然,我可以从错误的jar中删除这个包,但我不想使用这个方法…

Java按顺序在类路径中搜索包/类。而不是使用通配符

java -Xmx1024M -cp libs/*;. org.test.Main
。。。按照所需的顺序写出类路径,jar首先包含“correct”
org.test.configuration

java -Xmx1024M -cp libs/test-config.jar;libs/other.jar;libs/etc.jar;. org.test.Main
编辑

您可能仍然可以使用通配符,只需首先显式列出所需的jar,并让它在类路径中重复:

java -Xmx1024M -cp libs/test-config.jar;libs/*;. org.test.Main

以下是一份:

org\test\Main.java(在Main.jar中):

org\test\configuration\Config.java(在config1.jar中):

org\test\configuration\Config.java(在config2.jar中):

java-cp libs\*;。org.test.Main
org.test.configuration。Config@1540e19d

java-cp libs\config2.jar;libs\*;。org.test.Main
空的


在类路径中只使用
libs\*
导致首先包含config1.jar,并返回一个live
Config
对象。使用
libs\config2.jar;libs\*
导致首先包含config2.jar中的
Config
,并返回了
null

我已经尝试过了,但不幸没有成功。我试着把config.jar放在另一个之前,也试着反过来。但它只是装了一个假罐子。我当然检查了config类是否在同一个包中的两个jar文件中。错误的是返回一个空对象,所以我可以测试它。当我启动服务器时,我总是得到一个NullpointerException。如果java使用另一个配置类,那么将有一个功能完整的对象可以使用。但是java只加载了错误的jar…我添加了一个,表明如果多个jar包含相同包/类的不同实现,那么更改类路径上jar的顺序确实会影响JVM使用哪个jar/包。一定是其他因素导致了您的问题。我发现了我的问题:maven
pom.xml
中没有包含“real”config JAR文件。生成的JAR文件都有config类,但所有其他项目都包含错误的config类作为依赖项。因此,尽管我在类路径中引入了“真实”配置类,但仍然使用了错误的配置类。似乎maven仍然关注pom.xml,即使在构建jar文件之后也是如此。因为当我添加正确的依赖项时,我们正在做的正是您所说的:)。。。但我仍然持怀疑态度。我的观察结果正确吗?如果没有看到您的maven
pom.xml
文件,很难说。Maven依赖通常只是编译时依赖。它们在构建过程中添加到路径中,只是为了确保外部参照有效。但是Maven也可以解包依赖JAR,并将它们重新打包到生成的JAR中。另一件需要调查的事情是jar的
META-INF/MANIFEST.MF
,它可能在
package org.test;

import org.test.configuration.Config;

public class Main {

    public static void main(String[] args) {
        Config cfg = Config.getConfig();
        System.out.println(cfg);
    }
}
package org.test.configuration;

public class Config {
    public static Config getConfig() {
        return new Config();
    }
}
package org.test.configuration;

public class Config {
    public static Config getConfig() {
        return null;
    }
}