我有同一个第三方库的两个不同版本,需要部署到两个不同的系统。每个系统使用不同版本的库。
LibraryA和LibraryB具有相同的 API 接口,我的代码目前使用LibraryA构建并部署到SystemA。现在我需要使用LibraryB构建并部署到SystemB的第二个版本。
当然,我可以复制/粘贴我的代码并使用不同的库编译每个项目,但这似乎是维护的噩梦。这两个库可以同时安装和开发。目前我正在使用 Ant,但一切都在桌面上,任何可以提供帮助的东西都会被考虑。
我有同一个第三方库的两个不同版本,需要部署到两个不同的系统。每个系统使用不同版本的库。
LibraryA和LibraryB具有相同的 API 接口,我的代码目前使用LibraryA构建并部署到SystemA。现在我需要使用LibraryB构建并部署到SystemB的第二个版本。
当然,我可以复制/粘贴我的代码并使用不同的库编译每个项目,但这似乎是维护的噩梦。这两个库可以同时安装和开发。目前我正在使用 Ant,但一切都在桌面上,任何可以提供帮助的东西都会被考虑。
我设法使用增强的 Ant 构建文件和 Eclipse 设置来解决这个问题。这满足了我们对在 Eclipse 中切换库、使用两个库进行编译/测试以及部署到不同环境的临时能力的要求。
Ant 构建脚本最初是在 LibraryA 上编译和测试的,我复制并粘贴了 LIbraryB 的另一部分。这允许项目同时使用 LibraryA 和 LibraryB 进行编译,并在这两个库上运行 JUnint 测试。
启动脚本修改为 java -cp "Project.jar:$SYMLINK_LIB/*" project.main [空格分隔参数]
$SYMLINK_LIB 包含指向在两个不同环境之间不同的 jar 库的符号链接。
Eclipse 配置
你需要一个依赖管理器。Apache ivy将是我的首选工具。
运行我的构建后:
├── build
│ ├── ivy
│ │ ├── com.myspotontheweb-demo-compile.html
│ │ ├── com.myspotontheweb-demo-runtimeA.html
│ │ ├── com.myspotontheweb-demo-runtimeB.html
│ │ └── ivy-report.css
│ ├── systemA
│ │ ├── log4j-1.2.17.jar
│ │ ├── slf4j-api-1.7.5.jar
│ │ └── slf4j-log4j12-1.7.5.jar <-- Version 1.7.5
│ └── systemB
│ ├── log4j-1.2.17.jar
│ ├── slf4j-api-1.7.5.jar
│ └── slf4j-log4j12-1.7.4.jar <-- Version 1.7.4
├── build.xml
└── ivy.xml
笔记:
Ivy 使用一个称为配置的概念来管理不同的依赖组。在这种情况下,我们为编译所需的第 3 方 jar 创建一个配置,然后再创建两个配置来处理 SystemA 和 SystemB 依赖项:
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtimeA" description="System A runtime dependencies" extends="compile"/>
<conf name="runtimeB" description="System A runtime dependencies" extends="compile"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
<!-- runtimeA dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.5" conf="runtimeA->default"/>
<!-- runtimeB dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.4" conf="runtimeB->default"/>
</dependencies>
</ivy-module>
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<property name="build.dir" location="build"/>
<target name="bootstrap" description="Install ivy">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar"/>
</target>
<target name="resolve" description="Use ivy to resolve classpaths">
<ivy:resolve/>
<ivy:report todir='${build.dir}/ivy' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
</target>
<target name="build" depends="resolve" description="Do something with each set of runtime jars">
<ivy:retrieve pattern="${build.dir}/systemA/[artifact]-[revision](-[classifier]).[ext]" conf="runtimeA"/>
<ivy:retrieve pattern="${build.dir}/systemB/[artifact]-[revision](-[classifier]).[ext]" conf="runtimeB"/>
</target>
<target name="clean" description="Cleanup build files">
<delete dir="${build.dir}"/>
</target>
<target name="clean-all" depends="clean" description="Additionally purge ivy cache">
<ivy:cleancache/>
</target>
</project>
笔记: