Итак, я прошел через это, полностью удалив Python, что я неохотно делал, а затем переустановил Python 2. Мне пришлось обновить мой путь и открыть новую оболочку, чтобы он увидел новую установку Python 2 и все стало на свои места. Сейчас я использую pyenv для своего проекта Python 3, и это мечта.
Посмотрите на OSGi - он имеет дело с управлением версиями и управлением пакетами (банки) очень приятно.
ТАКЖЕ: Eclipse (который создается сверху OSGi) имеет некоторые относительно новые Инструменты API, которые могут помочь Вам сравнить свой API с предыдущей базовой линией и определить, как соответственно выразить следующий номер версии Ваших пакетов.
Общая схема управления версиями затмения:
v.m.n.q
где
v: высокоуровневая версия - изменения здесь представляют обычно повреждающиеся изменения в API
m: существенные изменения - новая функциональность, новый API
n: незначительные изменения - тот же API, закулисные изменения
q: спецификатор - полезный для маркировки сборок, альфы/беты, и т.д.
OSGi указывает зависимости от версии с помощью диапазонов. Например,
Require-Bundle: com.javadude.foo;bundle-version="[1.2.0,2.0.0)"
в Вашем MANIFEST.MF указывает, что пакет требует версии 1.2.0 или позже пакета com.javadude.foo, через (но не включая) версия 2.0.0.
Можно также указать зависимости на уровне пакета вместо этого.
Я также использовал Java больше десятилетия, но я должен сказать, что не нашел много проблем ада JAR вообще (даже использующий все сторонние инструменты, которые Вы упоминаете)! Я нашел Maven
чтобы быть ужасным инструментом, так создайте все с ant
.
В нашей компании у нас есть сделанное на заказ разрешение зависимости ant
задача на основе простого (маленького) файла зависимости для каждого проекта, вместе с определением каждого проекта как любой app
или a lib
(необходимо только когда-либо зависеть от a lib
; никогда app
). Это работает просто великолепно.
Мы также имеем ant
задачи изменить наше затмение .classpath
и ИДЕЯ .iml
файлы для генерации графов зависимостей для наших IDE.
Преимущество, которое.NET имеет по Java, состоит в том, что библиотеки связываются более тесно с ОС. То, что библиотеки платформы, если они установлены, легко расположено в GAC, действительно упрощает вещи, но Вы также в значительной степени ограничены Windows. Лучшее сравнение было бы Моно, но у меня нет опыта там.
Управление конфигурацией, по крайней мере, мне, всегда было большой болью разработки программного обеспечения. Чем больше Вы пытаетесь использовать в своих интересах существующий код, тем хуже это кажется для становления. Сама проблема не уникальна для Java, но быстрого увеличения версий, количество времени, которым платформа была вокруг, и количество поддерживаемых платформ, действительно кажется, делает ее хуже. Я просто проверил, и у меня есть 3 версии JRE на моем поле прямо сейчас - и я даже не активный Java-разработчик.
Относительно Вашего вопроса, я не уверен, является ли это самая нажимающая потребность функции. Лично, я хотел бы видеть некоторую лучшую поддержку веб-сервисов, особенно те, которые требуют заголовков аутентификации. В прошлый раз, когда я пытался заставить Java взаимодействовать с одним из моих веб-сервисов.NET, я почти оторвал волосы. Используя LINQ с C#/.Net, я могу также сказать, что это было бы довольно прохладным дополнением к Java возможно с большим количеством повышений эффективности, которые будут иметься.
Я столкнулся с этой проблемой на сайте, в котором я работал: созданный инструмент, чтобы пробежать файлы банки, живущие на веб-сервере и найти все вложенные копии файлов банки - и различных файлов с теми же именами (например: версии log4j.jar). Это была отвратительная путаница, включая одну ВОЙНУ, которая имела банку WebLogic в нем.
Не уверенный, каково решение.
Вещь: Java имеет материал для управления этим - штампованные файлы банки с версиями пакета. И особенно: webstart. Возможно, то, что необходимо, является некоторым classloader, который делает вещь webstart-типа.
Как насчет: в декларации JAR Вы указываете зависимости библиотеки, с помощью известных имен и версий. classloader - обеспеченный контейнером или временем выполнения - был бы ответственен за получение версий, которые Вы хотите.
Существует много систем (например: Знаток самостоятельно) для управления известными местами для загрузки библиотек с, а также штрейкбрехер и этажерка.
.NET поддерживает бок о бок блоки, таким образом, у Вас может быть несколько версий того же приложения вокруг. GAC как общий DLLs, но тем не менее можно зарегистрировать несколько версий того же блока в GAC, и другой блок может запросить определенное или большее - чем версия, если я помню хорошо. В JavaEE у Вас действительно есть несколько уровней загрузчика класса btw, и можно сделать некоторые приемы, моделирующие подобное управление версиями