Я бы предложил использовать Apache ivy для управления сложными путями к классам. Он выносит зависимости вашей сборки в отдельный файл ivy.xml.
Во-вторых, ivy может автоматически загружать такие зависимости, уменьшая размер вашего проекта под контролем исходного кода.
Наконец, это решение на первый взгляд может показаться ужасно сложным. Его преимущество в том, что он совместим с другими технологиями сборки, такими как Maven.
Пример
плющ.xml
Ivy использует «конфигурации» для управления логическими группами банок.
В этом примере код компилируется с помощью API-файлов SLF4J, но во время выполнения используются разные реализации ведения журнала:
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime.simple" description="Runtime environment with minimal logging" extends="compile"/>
<conf name="runtime.complex" description="Runtime environment with logback enabled" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime.simple"/>
<conf name="build" description="ANT tasks used by build"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>
<!-- simple runtime dependencies -->
<dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="runtime.simple->default"/>
<!-- complex runtime dependencies -->
<dependency org="ch.qos.logback" name="logback-classic" rev="1.0.3" conf="runtime.complex->default"/>
<!-- test dependencies -->
<dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
<!-- Build dependencies -->
<dependency org="org.codehaus.groovy" name="groovy-all" rev="1.8.6" conf="build->default"/>
</dependencies>
</ivy-module>
Примечания:
- Атрибут extends позволяет создавать наборы объединений jar.
- По умолчанию ivy загружается из Maven Central (открытый репозиторий, в котором сейчас размещено около 90% программного обеспечения Java с открытым исходным кодом). .
- Используя атрибут conf, вы можете связать зависимость с одной или несколькими вашими локально определенными конфигурациями.
- Ivy также можно использовать для управления зависимостями сторонних задач ANT.
build.xml
Задачи Ivy ANT импортируются как antlib. Задача ivy cachepath используется для превращения управляемого ivy конфигурации в обычные ANT пути и ivy report создает отчет о зависимостях.
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="init">
<ivy:resolve/>
<ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="runtime.simple.path" conf="runtime.simple"/>
<ivy:cachepath pathid="runtime.complex.path" conf="runtime.complex"/>
<ivy:cachepath pathid="test.path" conf="test"/>
<ivy:cachepath pathid="build.path" conf="build"/>
</target>
..
..
Задача ivy retrive используется для заполнения каталога во время этап упаковки вашего приложения:
<target name="war">
<ivy:retrieve pattern="${build.dir}/libs/[artifact].[ext]" conf="runtime.complex"/>
<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
<fileset dir="${src.dir}/html/myapp"/>
<fileset dir="${src.dir}/jsp/myapp"/>
<lib dir="${build.dir}/libs"/>
<classes dir="${build.dir}/classes"/>
</war>
</target>
Файлы конфигурации IDE
Доступен плагин Eclipse для ivy.
Также можно создавать файлы конфигурации IDE с помощью встроенной задачи groovy. Ниже приведен пример Eclipse:
<target name="eclipse">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>
<ivy:cachefileset setid="libfiles" conf="compile"/>
<groovy>
<arg value="${src.dir}"/>
<arg value="${build.dir}/classes"/>
import groovy.xml.MarkupBuilder
//
// Generate the project file
//
project.log("Creating .project")
new File(".project").withWriter { writer ->
def xml = new MarkupBuilder(writer)
xml.projectDescription() {
name(project.name)
comment()
projects()
buildSpec() {
buildCommand() {
name("org.eclipse.jdt.core.javabuilder")
arguments()
}
}
natures() {
nature("org.eclipse.jdt.core.javanature")
}
}
}
//
// Generate the classpath file
//
// The "lib" classpathentry fields are populated using the ivy artifact report
//
project.log("Creating .classpath")
new File(".classpath").withWriter { writer ->
def xml = new MarkupBuilder(writer)
xml.classpath() {
classpathentry(kind:"src", path:args[0])
classpathentry(kind:"output", path:args[1])
classpathentry(kind:"con", path:"org.eclipse.jdt.launching.JRE_CONTAINER")
project.references.libfiles.each {
classpathentry(kind:"lib", path:it)
}
}
}
</groovy>
</target>
person
Mark O'Connor
schedule
30.05.2012
s Eclipse as well as RAD. so I want ANT to generate the ".classpath" files. Yes the requirement for different classpaths is associated with different target environments as well as IDE. the dependency on environment is as u said. on IDE it occurs because i have some project related plugins that are RAD compatible but not eclipse. those plugin provide me with a set of library in RAD. whereas in eclipse i have to create a "User Library". so requirement to manage different classpaths is associated with different target environments as well as IDE
- person Mukul Goel   schedule 30.05.2012