如何构建具有不同依赖项的 2 个 jar 文件



我有两个不同版本的同一个第三方库,需要部署到两个不同的系统。 每个系统使用不同版本的库。

LibraryA

和 LibraryB 具有相同的 API 接口,我的代码目前是使用 LibraryA 构建并部署到 SystemA 的。 现在我需要第二个版本,它使用 LibraryB 构建并部署到系统 B

当然,我可以复制/粘贴我的代码并使用不同的库编译每个项目,但这似乎是一场维护噩梦。 两个库可以同时安装和开发。 目前我正在使用蚂蚁,但一切都摆在桌面上,任何可以提供帮助的事情都会被考虑。

你需要一个依赖关系管理器。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

注意:

  • 系统A系统B 目录包含同一 jar 的两个不同版本。
  • 我已将构建配置为生成依赖项管理报告。对于故障排除和文档记录很有用。

常春藤.xml

Ivy 使用称为配置的概念来管理不同的依赖项组。在这种情况下,我们为编译所需的第三方 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>

构建.xml

<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>

笔记:

  • 检索任务用于使用由 ivy 管理的文件集合填充所选目录。
  • 引导目标将下载并安装 ivy 任务 jar
  • 缓存路径和报告任务是有用的附加任务
  • Ivy 缓存下载的文件,因此包含清理缓存任务总是一个好主意(所有缓存都会变脏)

我设法通过增强的 Ant 构建文件和 Eclipse 设置来解决这个问题。 这满足了我们对在 Eclipse 中切换库、使用两个库进行编译/测试并部署到不同环境的临时能力的要求。

Ant 构建脚本最初在 LibraryA 上编译和测试,我复制并粘贴了 LIbraryB 的另一个部分。 这允许项目同时使用 LibraryA 和 LibraryB 进行编译,并对这两个库运行 JUnint 测试。

启动脚本已修改为 java -cp "Project.jar:$SYMLINK_LIB/*" project.main [空格分隔参数]

$SYMLINK_LIB 包含指向两个不同环境之间不同的 jar 库的符号链接。

日食配置

  1. 为库 A 和库 B 构建了一个项目
  2. 对于这两个项目,右键单击该项目一个。点击"库"和"添加 JAR" 我。添加此库所需的 jar 文件b.点击标签"订购和导出" ii. 检查所有 jar 文件,以便导入此项目的任何项目都可以使用它们。c. 点击"确定"
  3. 右键单击需要导入库 A 和库 B 的项目一个。单击选项卡"项目"和"添加"以添加项目库A(或库B)b.如果此项目将由需要访问库 A 或库 B 的其他项目导入 - 单击"订购和导出"并选择库 A 和库 B。c. 点击"确定"

相关内容

  • 没有找到相关文章

最新更新