Как управлять необходимыми, конфликтующими зависимостями Java

Скажем, мне нужно (это обязательно) использовать fizz-1.0.jar и buzz-2.3.2.jar в моем проекте Java. Теперь fizz-1.0.jar зависит от foo-0.1.35.jar, а buzz-2.3.2.jar зависит от foo-4.2.17.jar.

foo-0.1.35.jar содержит класс Widget следующим образом:

public class Widget {
    public int doSomething(int x) {
        return x++;
    }
}

foo-4.2.17.jar содержит сильно измененную версию Widget:

public class Widget {
    public Meh makeStuff() {
        return new Meh();
    }
}

К сожалению, и fizz-1.0.jar, и buzz-2.3.2.jar активно используют обе версии Widget.

Я не могу просто слепо добавить обе версии foo-x.y.z.jar в путь к классам, потому что какая бы Widget ни была загружена первой, она будет работать только для fizz-1.0.jar или buzz-2.3.2.jar.

Какие у меня есть варианты? Помните, что я должен иметь как fizz-1.0.jar, так и buzz-2.3.2.jar, и должен удовлетворять всем их транзитивным зависимостям.


person Community    schedule 29.05.2013    source источник
comment
Короче говоря, вы в большой беде.   -  person Marko Topolnik    schedule 29.05.2013
comment
stackoverflow.com/questions/1553567/   -  person orangegoat    schedule 29.05.2013


Ответы (1)


Я бы порекомендовал вам использовать структуру, которая различает нагрузки классов. Например. OSGi-фреймворк. Затем вы можете создать 2 пакета — один с реализацией fizz и один с реализацией buzz. Они оба могут содержать свои зависимые библиотеки, которые больше не конфликтуют, потому что они загружаются из загрузчиков двух разных классов.

Например, контейнеры osgi или «Eclipse Equinox» и «Apache Felix», но есть и другие.

Надеюсь, это поможет.

person Michael Mangeng    schedule 29.05.2013
comment
если вы не хотите использовать такой контейнер, вы также можете загрузить классы самостоятельно, используя urlclassloader. но этот подход сложнее :-) - person Michael Mangeng; 29.05.2013