Смотрите на Sourcegear DiffMerge. DiffMerge является сравниванием и инструментом слияния от их продуктов Хранилища и Крепости, но они делают его доступным бесплатно как автономный инструмент. Одна достойная внимания особенность - то, что это позволяет diffing всех деревьев каталогов.
Редактирование: , В то время как DiffMerge остается бесплатным инструментом, он ворчит для регистрации со всплывающим окном, по крайней мере, один раз в день (по крайней мере, начиная с версии 4.2). Это также указывает во всплывающем окне:
Избранные новые возможности в будущих выпусках также потребуют регистрации, но базовые функции и меры будут доступны всем.
Вы можете создать мета-модуль ivy, который зависит от всех этих общих пакетов, а затем все ваши другие проекты разрешают общие библиотеки через транзитивную зависимость:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="com.example" module="common-libs"/>
<configurations>
<conf name="runtime" transitive="true" visibility="public" />
<conf name="master" transitive="true" visibility="public" />
<conf name="compile" transitive="true" visibility="public" />
<conf name="default" transitive="true" visibility="public" extends="master" />
</configurations>
<dependencies>
<dependency org="oracle" name="ojdbc14_g" rev="10.2.0.3"
conf="compile->compile(*),master(*);runtime->runtime(*);master->master(*)"/>
<dependency org="tomcat" name="servlet-api" rev="6.0.16"
conf="compile->compile(*),master(*);runtime->runtime(*);master->master(*)"/>
<dependency org="junit" name="junit" rev="4.3"
conf="compile->compile(*),master(*);runtime->runtime(*);master->master(*)"/>
</dependencies>
</ivy-module>
И для типичного проекта:
<?xml version="1.0"?>
<ivy-module version="2.0">
<info organisation="com.example" module="myproject"/>
<configurations>
<conf name="runtime" transitive="true" visibility="public" />
<conf name="master" transitive="true" visibility="public" extends="runtime"/>
<conf name="compile" transitive="true" visibility="public" />
<conf name="default" transitive="true" visibility="public" extends="master" />
</configurations>
<dependencies>
<dependency org="com.example" name="common-libs" rev="latest.release"
conf="compile->compile(*),master(*);runtime->runtime(*);master->master(*)"/>
</dependencies>
</ivy-module>
Здесь я использую традиционные соглашения об именах конфигураций из POM- > Плющ переводы резолвера Maven, хотя вы можете сопоставить имена конфигураций любым понятным для вас способом. Я обычно использую задачу ivy: install для копирования модулей Maven в наш репозиторий Ivy, поэтому по большей части я использую ivy.xmls по умолчанию. Если вы используете IvyRoundup, вы в первую очередь захотите транзитивно отобразить конфигурацию «по умолчанию».
m, используя традиционные соглашения об именах конфигураций из переводов POM-> Ivy распознавателя Maven, хотя вы можете сопоставить имена конфигураций любым удобным для вас способом. Я обычно использую задачу ivy: install для копирования модулей Maven в наш репозиторий Ivy, поэтому по большей части я использую ivy.xmls по умолчанию. Если вы используете IvyRoundup, вы в первую очередь захотите транзитивно отобразить конфигурацию «по умолчанию». m, используя традиционные соглашения об именах конфигураций из переводов POM-> Ivy распознавателя Maven, хотя вы можете сопоставить имена конфигураций любым удобным для вас способом. Я обычно использую задачу ivy: install для копирования модулей Maven в наш репозиторий Ivy, поэтому по большей части я использую ivy.xmls по умолчанию. Если вы используете IvyRoundup, вы в первую очередь захотите транзитивно отобразить конфигурацию «по умолчанию». Если вы используете ivy от ant и используете Ant 1.6 или новее, вы можете использовать задачу
для включения фрагментов файла сборки в файл сборки ant . Однако указанные файлы должны быть полными файлами сборки Ant:
<?xml version="1.0"?>
<project name="my-project" default="usage" basedir=".">
<target name="setup">
...
</target>
<import file="./common.xml"/>
...
</project>
Вы также можете использовать стандартный синтаксис XML из файла ivy.xml
или build.xml
:
<?xml version="1.0"?>
<!DOCTYPE project [
<!ENTITY common SYSTEM "common.xml">
]>
<project name="my-project" default="usage" basedir=".">
<target name="setup">
...
</target>
&common;
...
</project>
Это будет буквально включать содержимое common.xml
, где вы разместили объект & common;
.
(в данном примере имя файла common.xml
разрешается анализатором XML относительно содержащего XML файла. Вы также можете использовать абсолютный файл:
URI протокола.)