在启动应用程序时排除类路径中的类或包

问题描述:

我在文件夹内有多个*.jar文件,这些文件都包含在类路径中,以便在Microsoft Windows OS中启动指定的主类。这是目前实现这样的:在启动应用程序时排除类路径中的类或包

@echo off 
java -Xmx1024M -cp libs/*;. org.test.Main 

现在我有问题,该libs文件夹内有两个JAR文件,两者有一个相同的封装org.test.configuration。两者都不相同,当我现在启动程序时,我收到错误,因为Java VM选择了错误的错误。

如何在我的启动脚本中排除一个特殊包或一个特殊类? (当然,我可以将这个软件包从错误的jar中删除,但我不想使用这种方法...)

Java按顺序搜索packages/classes的类路径。代替使用通配符...

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

...写出所希望的顺序进行类路径,与第一含的“正确” org.test.configuration包的广口瓶中。

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

编辑

你也许能够逃脱仍然使用通配符,由第一只明确列出所需的罐子,让它得到复制在classpath:

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

这里是一个Minimal, Complete, Verifiable Example

有机\测试\ Main.java(在的main.jar):

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); 
    } 
} 

有机\测试\配置\ Config.java(在config1.jar):

package org.test.configuration; 

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

有机\测试\配置\ Config.java(在config2.jar):

package org.test.configuration; 

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

的java -cp库\ * ;. org.test.Main
[email protected]

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

在classpath中只使用libs\*导致config1.jar被首次列入,并返回现场Config对象。使用libs\config2.jar;libs\*导致来自config2.jar的Config被首先包括,并且返回null

+0

我已经试过这个,但不幸的是没有成功。我试图把config.jar放在另一个之前,也是另一种方式。但它只是装载了错误的jar文件。我当然检查了config类在同一个包中的两个jar文件中。而错误的是返回一个NULL对象,所以我可以测试是。当我启动服务器时,我总是得到一个NullpointerException。如果java使用其他配置类,将会有一个完整的功能对象来处理。但是java只会加载错误的... – christopher2007

+0

我已经添加了[mcve],表明如果多个jar包含相同的不同实现,则更改Jpath在类路径上的顺序会影响JVM使用的jar /包包/类。必须有其他因素导致您的问题。 – AJNeufeld

+0

我发现我的问题:“真正的”配置JAR文件未包含在Maven的'pom.xml'中。生成的JAR文件都有配置类,但所有其他项目都包含错误的配置类作为依赖关系。所以,尽管我在类路径中引入了“真实”配置类,但仍然使用了错误的配置类。看起来,即使在构建jar文件之后,maven仍然关注pom.xml。因为当我添加正确的依赖关系时,我们正在做你正在说的:)但是我仍然怀疑。那么我对这个观察是否正确? – christopher2007