我在文件夹中有多个*.jar
文件,这些文件都包含在类路径中,以便在Microsoft Windows OS中启动指定的主类。目前这是这样完成的:
@echo off
java -Xmx1024M -cp libs/*;. org.test.Main
现在,我有一个问题,在
libs
文件夹中有两个JAR文件,它们都具有一个相同的程序包org.test.configuration
。两者都不同,现在启动程序时,我得到了错误,因为Java VM选择了错误的错误。如何在启动脚本中排除一个特殊的Package或一个特殊的Class? (当然,我可以从错误的jar中删除此程序包,但我不想使用此方法...)
最佳答案
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
。