`

升级ant配置文件(关于copy maven依赖jar),如何优雅的自动copy scope为system的jar

阅读更多

升级ant配置文件(关于copy maven依赖jar),如何优雅的自动copy scopesystemjar

 

(:这个文档需要 antmaven的基础知识)

 

(不想看废话的,直接跳最后面看结论)

 

ant发布的时候copy lib,公司架构师以前是这样来的

 

   <target name="copyLib">

      <artifact:dependencies filesetId="project.dep.fileset" useScope="runtime">

        <pom file="pom.xml" />

      </artifact:dependencies>

 

      <mkdir dir="${deploy.home}/WEB-INF/lib" />

      <copy todir="${deploy.home}/WEB-INF/lib">

        <fileset refid="project.dep.fileset" />

        <mapper type="flatten" />

      </copy>

 

      <copy todir="${deploy.home}/WEB-INF/lib">

        <fileset dir="${basedir}/lib/payment" />

      </copy>                          

   </target>

 

payment 里面 chinabank.jar 等第三方的jar, maven

<scope>system</scope>

<systemPath>${basedir}/lib/payment/chinabank.jar</systemPath>

 

方式进行管理的 ,

 

因为scope system,单独 useScope="runtime" 是不会copy ,因此早期的架构师是这么写的 ,这么写有个局限性,systemjar 必须放在${basedir}/lib/payment 路径下面

 

今天发现 artifact:dependencies 还有个参数 scopes,useScope 的关系是二者选其一,不能同时使用

 

 

useScope 只有三个值,

compile - Includes scopes compile, system and provided
runtime - Includes scopes compile and runtime
test - Includes scopes system, provided, compile, runtime and test

没有我们需要的, test 超过我们需要的, compile runtime  都没有system scope

 

我们使用 scopes (Since 2.0.10) ,支持逗号分隔的scope,如果没有指定值,所有的scope 将被包含

 

ok,那么我们改成

 

   <target name="copyLib">

      <artifact:dependencies filesetId="project.dep.fileset" scopes="compile,runtime,system">

        <pom file="pom.xml" />

      </artifact:dependencies>

 

      <mkdir dir="${deploy.home}/WEB-INF/lib" />

      <copy todir="${deploy.home}/WEB-INF/lib">

        <fileset refid="project.dep.fileset" />

        <mapper type="flatten" />

      </copy>

   </target>

 

这样,我们新增一个system范围的jar,就不用手工的再次修改build.xml,  运行下看看,看看到底有没有copy 我们的 chinabank.jar

 

检查下,没有!!!!!!! (看来和我们想象的不一样)

 

 

搜了下文档,原来是这样的

 

使用system  scope(指定本机系统的一个路径)的依赖可能在本机maven仓库外面.
一个 Ant fileset 只能允许一个单一的base文件夹,所以这些依赖将不包含在为解决依赖生成的fileset里面
但是被包含在 path 对象里面

 

还好,可以放在pathid 里面

 

尝试下存放到pathid里面,再用for循环取,
(for
属于 ant-contrib,怎么用,自己去研究),妈咪妈咪轰,给个传送门http://www.google.com.hk/search?gcx=c&client=aff-cs-360chromium&ie=UTF-8&q=ant-contrib

 

      <artifact:dependencies pathid="pathSystem" scopes="system">

        <pom file="pom.xml" />

      </artifact:dependencies>

      <for param="mavenSystemJar">

        <path refid="pathSystem" />

        <sequential>

           <echo>@{mavenSystemJar}</echo>

           <copy todir="${deploy.home}/WEB-INF/lib" file="@{mavenSystemJar}" />

        </sequential>

      </for>

 

运行

 

copyLib:

     [echo] E:\dataFixed\.m2\repository\chinabank\chinabank\1.0\chinabank-1.0.jar

 

BUILD FAILED

E:\Workspaces\baozun\nikeplatform\nike-frontend\build.xml:25: The following error occurred while executing this line:

E:\Workspaces\baozun\nikeplatform\nike-frontend\build.xml:29: Warning: Could not find file E:\dataFixed\.m2\repository\chinabank\chinabank\1.0\chinabank-1.0.jar to copy.

 

 

不行,读出来的 jar 路径不是我配置的路径,我并没有deploy repository,我是直接放在项目下面的

 

没辙了,去看看源码吧,看看到底怎么设值的

 

debug 模式运行下  ,看到这样的日志

 

 

Class org.apache.maven.artifact.resolver.ArtifactResolutionResult loaded from ant loader (parentFirst)

Class org.apache.tools.ant.types.FileList loaded from parent loader (parentFirst)

Class org.apache.tools.ant.types.FileSet loaded from parent loader (parentFirst)

Class org.apache.tools.ant.types.PatternSet$NameEntry loaded from parent loader (parentFirst)

Class org.apache.tools.ant.types.FileList$FileName loaded from parent loader (parentFirst)

Setting project property: chinabank:chinabank:jar -> E:\Workspaces\baozun\nikeplatform\nike-frontend\lib\payment\chinabank.jar

Setting project property: cmbc:cmbc:jar -> E:\Workspaces\baozun\nikeplatform\nike-frontend\lib\payment\cmbJava15.jar

Class org.apache.tools.ant.types.Path loaded from parent loader (parentFirst)

Adding reference: pathSystem

Finding class net.sf.antcontrib.logic.ForTask

Loaded from E:\Workspaces\baozun\nikeplatform\nike-frontend\lib\ant\ant-contrib-1.0b3.jar net/sf/antcontrib/logic/ForTask.class

Class net.sf.antcontrib.logic.ForTask loaded from ant loader (parentFirst)

Class org.apache.tools.ant.taskdefs.MacroInstance loaded from parent loader (parentFirst)

Class java.util.ArrayList loaded from parent loader (parentFirst)

Class org.apache.tools.ant.types.DirSet loaded from parent loader (parentFirst)

Class java.util.Iterator loaded from parent loader (parentFirst)

Class java.util.Collection loaded from parent loader (parentFirst)

Class java.lang.Integer loaded from parent loader (parentFirst)

Class org.apache.tools.ant.taskdefs.MacroDef loaded from parent loader (parentFirst)

Class org.apache.tools.ant.taskdefs.MacroDef$Attribute loaded from parent loader (parentFirst)

Class java.io.File loaded from parent loader (parentFirst)

     [echo] E:\dataFixed\.m2\repository\chinabank\chinabank\1.0\chinabank-1.0.jar

     [echo] E:\dataFixed\.m2\repository\cmbc\cmbc\1.0\cmbc-1.0.jar

 

 

可以看到 property 设置的是正确的,但是 取出来的却是错误的 ,哪里出现问题了???

 

再次调式下

 



 

 

会看到 属性已经被设置到 对应的 property 中去了

 

那么我们可以 直接这么取了

 

 

      <artifact:dependencies pathid="pathSystem" scopes="system">

        <pom file="pom.xml" />

      </artifact:dependencies>

      <echo>${cmbc:cmbc:jar}</echo>

      <echo>${chinabank:chinabank:jar}</echo>

      <copy todir="${deploy.home}/WEB-INF/lib" file="${cmbc:cmbc:jar}" />

      <copy todir="${deploy.home}/WEB-INF/lib" file="${chinabank:chinabank:jar}" />

 

运行

 

 

copyLib:

     [echo] E:\Workspaces\baozun\nikeplatform\nike-frontend\lib\payment\cmbJava15.jar

     [echo] E:\Workspaces\baozun\nikeplatform\nike-frontend\lib\payment\chinabank.jar

     [copy] Copying 1 file to E:\home\webuser\appserver\tomcat-nikefront\webapps\nikeshop\WEB-INF\lib

     [copy] Copying 1 file to E:\home\webuser\appserver\tomcat-nikefront\webapps\nikeshop\WEB-INF\lib

 

yes,但是 这不是我要的效果 ,新增一个system 还是得再add 一个 copy

 

再想想其他办法

 

查查文档,写个ant java ,

 

      Project project = new Project();

      project.init();

      ProjectHelper helper = ProjectHelper.getProjectHelper();

      File buildFile = new File("build.xml");

      helper.parse(project, buildFile);

      project.executeTarget("copyLib");

 

调试下

 

 



 

会发现,原来 pathid 设置引用的时候,filelist 就是 使用的 本机仓库的路径,这下悲剧了

 

网上追朔代码,会发现

 

        FileList fileList = new FileList();

        fileList.setDir( getLocalRepository().getPath() );

 

直接就把 dir的路径不分青红皂白()不区分scope设置成本机仓库,  这个我觉得是不正确的做法

 

我用的maven-ant-tasks 版本是2.0.10  (19-May-2009年的),会不会是版本的原因,那么使用个最新的版本(2.1.3)  (13-Apr-2011)看看

 

ant 也从1.6.5 换成1.8.2

 

执行下代码

 

发现果然成功了

 

build.xml代码如下

 

      <artifact:dependencies pathid="pathSystem" scopes="system" verbose="false">

        <pom file="pom.xml" />

      </artifact:dependencies>

      <!--

      <echo>${cmbc:cmbc:jar}</echo>

      <echo>${chinabank:chinabank:jar}</echo>

      <copy todir="${deploy.home}/WEB-INF/lib" file="${cmbc:cmbc:jar}" />

      <copy todir="${deploy.home}/WEB-INF/lib" file="${chinabank:chinabank:jar}" />-->

      <for param="mavenSystemJar">

        <path refid="pathSystem" />

        <sequential>

           <echo>@{mavenSystemJar}</echo>

           <copy todir="${deploy.home}/WEB-INF/lib" file="@{mavenSystemJar}" />

        </sequential>

      </for>

 

 

 



 

 

哦耶~~~~~,很高兴

 

 

 

我们先把 测试的代码封装一下,方便以后调用 (也算代码积累)

 

package com.feilong.tools.ant;

 

import java.io.File;

 

import org.apache.tools.ant.DefaultLogger;

import org.apache.tools.ant.Project;

import org.apache.tools.ant.ProjectHelper;

 

/**

 *ant 工具类

 *

 * @author <a href="mailto:venusdrogon@163.com">金鑫</a>

 * @version 1.0 2011-11-26 下午01:41:31

 */

public final class FeiLongAntUtil{

 

   /**

    * 执行某个任务

    *

    * @param antFilePath

    *            ant文件路径

    * @param targetName

    *            targetName

    * @param messageOutputLevel

    *            日志级别

    */

   public static void executeTarget(String antFilePath,String targetName,int messageOutputLevel){

      Project project = new Project();

      //添加日志输出         

      DefaultLogger consoleLogger = new DefaultLogger();

      consoleLogger.setErrorPrintStream(System.err);

      consoleLogger.setOutputPrintStream(System.out);

      //输出信息级别 

      consoleLogger.setMessageOutputLevel(messageOutputLevel);

      project.addBuildListener(consoleLogger);

      project.init();

      ProjectHelper helper = ProjectHelper.getProjectHelper();

      File buildFile = new File(antFilePath);

      helper.parse(project, buildFile);

      project.executeTarget(targetName);

   }

}

 

调用

 

package com.feilong.tools.ant;

 

import org.apache.tools.ant.Project;

import org.junit.Test;

 

public class FeiLongAntUtilTest{

 

   @Test

   public void executeTarget(){

      String file = "build.xml";

      String targetName = "copyLib";

      int messageOutputLevel = Project.MSG_DEBUG;

      FeiLongAntUtil.executeTarget(file, targetName, messageOutputLevel);

   }

}

 

看看源码 org.apache.maven.artifact.ant.DependenciesTask.class 改动很大,不是一般的大,路径代码都重构了

 

 

再看看 release log  http://maven.apache.org/ant-tasks/release-notes.html

 

2.1.0 Release Notes

The full list of changes can be found in our issue management system, and is reproduced below.

Bug

  • [MANTTASKS-4] - System scope not working properly in Maven Antlib
  • [MANTTASKS-152] - Mvn task omit localRepository param
  • [MANTTASKS-153] - Properties defined in Ant are not passed to Maven
  • [MANTTASKS-155] - Dependency fileset should set the current ant project
  • [MANTTASKS-159] - Wrong credentials used for mirrored repositories
  • [MANTTASKS-160] - Wrong metadata files created for mirrored remote repositories
  • [MANTTASKS-167] - Generated ant build file should save version list for version mapper

Improvement

  • [MANTTASKS-117] - Setting Maven user-properties not possible
  • [MANTTASKS-169] - Dependencies "verbose" option should be deprecated in favor of standard ant verbose option

New Feature

  • [MANTTASKS-151] - Support for artfacts that are 'classified' from birth
  • [MANTTASKS-156] - Add feature to dependencies task to write file paths to a file.
  • [MANTTASKS-168] - New task to write a pom file

看到没有,2.1.0修复了刚才的bug

 

 

好了总结下(有如下改动):

 

1. <path id="maven-ant-tasks.classpath" path="${basedir}/lib/ant/maven-ant-tasks-2.0.10.jar" />

 

改成   <path id="maven-ant-tasks.classpath" path="${basedir}/lib/ant/maven-ant-tasks-2.1.2.jar" />

 

 

2. copyLib 改成如下

 

   <target name="copyLib">

      <!---->

      <artifact:dependencies filesetId="project.dep.fileset" scopes="compile,runtime">

        <pom file="pom.xml" />

      </artifact:dependencies>

 

      <artifact:dependencies pathid="pathSystem" scopes="system">

         <pom file="pom.xml" />

      </artifact:dependencies>

     

      <property name="deploy.lib" value="${deploy.home}/WEB-INF/lib"></property>

     

      <mkdir dir="${deploy.lib}" />

      <!--

      <echo>${cmbc:cmbc:jar}</echo>

      <echo>${chinabank:chinabank:jar}</echo>

      <copy todir="${deploy.home}/WEB-INF/lib" file="${cmbc:cmbc:jar}" />

      <copy todir="${deploy.home}/WEB-INF/lib" file="${chinabank:chinabank:jar}" />-->

      <for param="mavenSystemJar">

        <path refid="pathSystem" />

        <sequential>

           <echo>@{mavenSystemJar}</echo>

           <copy todir="${deploy.lib}" file="@{mavenSystemJar}" />

        </sequential>

      </for>

 

      <!---->

      <copy todir="${deploy.lib}">

        <fileset refid="project.dep.fileset" />

        <mapper type="flatten" />

      </copy>

   </target>

 

收工,以后不管怎么加jar,都不需要改动ant

 

这次改动中学习了很多ant maven的高级知识,收获不小, 浪里格朗~~~

 

 

 

参考资料:

http://maven.apache.org/ant-tasks/index.html

http://maven.apache.org/ant-tasks/release-notes.html

  • 大小: 16 KB
  • 大小: 51 KB
  • 大小: 69.8 KB
0
2
分享到:
评论

相关推荐

    springboot+maven打包demo【将依赖与配置文件打包到jar包外部】

    在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...

    maven下通用的ant配置文件

    maven下通用的ant配置文件,只要0积分。只需修改11行末尾的target/自己的工程名即可。

    达梦数7据库j驱动包及方言包,maven依赖jar包,DM达梦数据库jdbc-jar包dialect方言jar包

    在实际开发中,开发者需要将这些JAR文件添加到项目的类路径中,或者如果使用Maven作为构建工具,可以在pom.xml文件中声明对应的依赖,以便在编译和运行时自动下载和管理这些库。这样,Java应用程序就能够利用这些库...

    elasticsearch 5.4.0 maven依赖jar包

    "elasticsearch 5.4.0 maven 依赖jar包" 指的是在 Maven 项目中使用 Elasticsearch 5.4.0 版本时,需要的全部依赖库文件。这些 jar 包包括 Elasticsearch 核心库、X-Pack 插件以及其他相关的第三方库,例如 Lucene、...

    maven依赖本地jar包

    Maven提供了`&lt;scope&gt;system&lt;/scope&gt;`这一特殊作用域,用于指定本地文件系统上的特定路径,以便在构建过程中引用这些路径下的JAR文件。这种方式要求开发者明确地提供JAR文件的完整路径,确保Maven构建过程中能够准确...

    jackson2.6.0 jar maven依赖.txt

    jackson2.6.0 jar maven依赖 jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖

    JxBrowser开发maven仓库jar包

    JxBrowser是一款强大的Java库,它允许开发者在Java应用程序中...对于JxBrowser,这个过程包括下载jar包、安装到本地仓库、并在项目中配置依赖。通过这样的方式,即使官方仓库不可用,我们依然能够保持项目正常运行。

    JSONObject相关jar包和maven管理jar包

    Maven通过在项目对象模型(Project Object Model, POM)文件中定义依赖,可以自动下载并管理所需的jar包,包括JSONObject,简化了项目的构建和部署过程。 **标签解析:** “JSONObject jar”标签明确了我们的讨论...

    maven打包 maven打jar包详细步骤

    而`maven-install-plugin`则负责将打包后的文件(无论是JAR还是WAR)放入本地Maven仓库,便于其他项目依赖。 对于`maven-jar-plugin`,它是Maven用于创建JAR文件的插件。你可以通过配置这个插件来指定主类、排除...

    Maven发布Jar包中文乱码解决方法

    Maven发布Jar包中文乱码解决方法 Maven 是一个基于项目对象模型(Project Object...通过在 pom.xml 文件中添加配置、在 Maven 命令中添加参数、在资源文件中添加配置等方式,可以解决 Maven 发布 Jar 包中文乱码问题。

    maven-ant-tasks.jar

    还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar

    mavenjar包

    标题中的 "mavenjar 包" 指的是使用 Maven 构建的 JAR 文件,通常包含了一个完整的Java项目,包括所有依赖的库。这种 JAR 文件可以被直接运行,或者作为其他应用的依赖来使用。 描述中提到的步骤,是在本地环境中...

    ant-1.6.5.jar.zip

    Apache Ant,简称为Ant,是Java社区中广泛使用的自动化构建工具,它以其XML为基础的构建文件格式和强大的任务库而闻名。Ant 1.6.5是这个工具的一个重要版本,它在Ant的发展历程中占据着关键地位。本文将深入探讨Ant ...

    Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中

    **Maven 插件** 如`spring-boot-maven-plugin`能够实现将Spring Boot应用打包为可执行的Jar或War文件,并且可以配置不同的参数来控制构建行为。例如,指定主类、排除某些依赖等。 ##### 2. 使用Maven安装本地Jar包 ...

    maven-jar-plugin-3.1.1.jar

    maven-jar-plugin-3.1.1.jar

    maven_jar.zip

    接下来,关于“分离jar包及配置文件”,这通常是为了便于管理和更新配置,避免每次升级软件时都需要替换整个JAR。我们可以使用`maven-resources-plugin`来处理配置文件。例如: ```xml ... &lt;directory&gt;src/...

    jodconverter2.2.2.jar Maven依赖包

    一旦添加了这个依赖,Maven就会自动下载并管理JODConverter的jar文件,使得开发者可以在代码中通过import语句直接引用库中的类和方法。 在实际使用JODConverter时,开发者需要创建Converter实例,指定源文件和目标...

    批量导入maven本地jar包

    批量导入maven本地jar包

    Maven引入本地Jar包并打包进War包中的方法

    scope属性指定了Jar包的来源于本地文件,而systemPath属性则指定了本地文件的所在路径。例如,下面是对cpdetector Jar包的配置: ``` &lt;groupId&gt;cpdetector &lt;artifactId&gt;cpdetector &lt;version&gt;1.0.10 &lt;scope&gt;...

Global site tag (gtag.js) - Google Analytics