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

Exclude class or package inside classpath when starting an application

我在一个文件夹中有多个 *.jar 文件,它们都包含在 class 路径中,以便在 Microsoft Windows 中启动指定的主要 class OS。目前是这样完成的:

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

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

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

Java 按顺序在 class 路径中搜索 packages/classes。而不是使用通配符 ...

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

...按照需要的顺序写出class路径,首先是包含"correct"org.test.configuration包的jar。

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

编辑

您仍然可以使用通配符,只需首先明确列出所需的 jar,然后让它在 class 路径中复制:

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
null

在 class 路径中仅使用 libs\* 导致首先包含 config1.jar,并返回一个活动的 Config 对象。使用 libs\config2.jar;libs\* 导致首先包含 config2.jar 中的 Config,然后返回 null