2016-07-27 8 views
1

У меня есть несколько файлов *.jar внутри папки, которые все включены в путь к классам, чтобы запустить указанный основной класс в ОС Microsoft Windows. Это в настоящее время осуществляется так:Исключить класс или пакет внутри пути к классам при запуске приложения

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

Теперь у меня есть проблема, что внутри папки libs есть два JAR-файлы, которые оба имеют один и тот же пакет org.test.configuration. Оба они разные, и когда я запускаю программу, я получаю ошибки, потому что неправильная выбрана Java VM.

Как я могу исключить один специальный пакет или один специальный класс в моем стартовом скрипте? (Конечно, я мог удалить этот пакет из неправильной банки, но я не хочу использовать этот метод ...)

ответ

2

Java ищет путь к классу для пакетов/классов по порядку. Вместо того чтобы использовать подстановочные ...

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 

Редактировать

Вы могли бы уйти еще с помощью метасимволов, просто явно первого листинга нужной банки, и позволяя ему получить дублируются в пути к классам:

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

Вот Minimal, Complete, Verifiable Example:

орг \ 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); 
    } 
} 

орг \ Test \ \ конфигурации 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 ЛИЭС \ config2.jar; ЛИЭС \ * ;. org.test.Main
нуль

Использование только libs\* в результате в пути к классам config1.jar включения первой и живой Config объект был возвращен. С использованием libs\config2.jar;libs\* в результате был включен Config из config2.jar, и был возвращен null.

+0

Я уже пробовал это, но, к сожалению, безуспешно. Я попытался поставить config.jar перед другим, а также наоборот. Но это всего лишь ложная фляга. Я, конечно, проверял, что класс конфигурации находится в обоих файлах jar в одном пакете. и неправильный возвращает объект NULL, поэтому я могу проверить.И когда я запускаю сервер, я всегда получаю исключение NullpointerException. Будет ли Java использовать другой конфигурационный класс, будет работать с полным функциональным объектом. Но java загружает только один ... – christopher2007

+0

Я добавил [mcve], показывая, что изменение порядка jars в пути к классам влияет на то, какой jar/package используется JVM, если несколько баннеров содержат разные реализации одного и того же пакет/классы. Должен быть какой-то другой фактор, вызывающий вашу проблему. – AJNeufeld

+0

Я нашел свою проблему: «реальный» конфигурационный JAR-файл не был включен в maven 'pom.xml'. В результате JAR-файлы имели класс конфигурации, но все остальные проекты включали неправильный класс конфигурации в качестве зависимости. Поэтому, хотя я привел «реальный» класс конфигурации в пути к классам, все еще использовался неправильный. кажется, что maven все еще обращает внимание на pom.xml, даже после создания файла jar. Потому что, когда я добавляю правильный, как зависимость, мы делаем именно то, что вы говорите :) ... но все же я скептически настроен. Так я исправлю это наблюдение? – christopher2007

 Смежные вопросы

  • Нет связанных вопросов^_^