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

时间:2016-07-27 15:18:02

标签: java classpath

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

...按照所需的顺序写出类路径,使用包含"正确"的jar。首先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

这是Minimal, Complete, Verifiable Example

org \ test \ 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);
    }
}

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

package org.test.configuration;

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

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

package org.test.configuration;

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

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

     

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

在类路径中仅使用libs\*导致首先包含config1.jar,并返回实时Config对象。使用libs\config2.jar;libs\*导致首先包含来自config2.jar的Config,并返回null