- 浏览: 512456 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (88)
- Ant (4)
- Apache (2)
- chm (1)
- Javadoc api (7)
- Spring (9)
- Maven (7)
- Hibernate (4)
- Postgresql (1)
- Velocity (1)
- 有意思的题目 (3)
- Solr (4)
- eclipse (7)
- jpa (3)
- java (8)
- excel (1)
- jsp (1)
- ubuntu (2)
- 设计模式 (1)
- memcached (1)
- tomcat (4)
- Exception (2)
- 实用小技巧 (5)
- javascript (1)
- jquery (1)
- nginx (5)
- html (1)
- 一步一步升级配置 (8)
- windows (1)
- 注册表 (1)
- chrome (2)
- tiles (1)
- git (3)
- json (1)
- log (5)
- node.js (1)
- gradle (1)
- spring-session (5)
- mysql (1)
- ajax (1)
- dubbo (1)
- springmvc (1)
- loxia (1)
最新评论
-
akang_cdx:
JPEGImageEncoder encoder = JPEG ...
【飞天奔月出品】javax.imageio.IIOException: Can't create output stream!tomcat 验证码,图片(原理) -
飞天奔月:
zuxianghuang 写道解决问题了,谢谢不客气
Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议 -
zuxianghuang:
解决问题了,谢谢
Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议 -
飞天奔月:
加上了 jdk8 String.join性能不错
字符串拼接汇总(性能对比) -
fanlei77:
JDK8的String.join可以加一下一起比较
字符串拼接汇总(性能对比)
升级ant配置文件(关于copy maven依赖jar),如何优雅的自动copy scope为system的jar
升级ant配置文件(关于copy maven依赖jar),如何优雅的自动copy scope为system的jar
(注:这个文档需要 ant和maven的基础知识)
(不想看废话的,直接跳最后面看结论)
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的 ,因此早期的架构师是这么写的 ,这么写有个局限性,system的jar 必须放在${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
发表评论
-
maven mvn install 报错 Received fatal alert: protocol_version 解决方案 (JDK7)
2018-08-21 16:46 22163maven mvn install 报错 Received ... -
【飞天奔月出品】使用Maven打all-in-one的包(带tests 和 sources)(多方案实现对比)
2016-12-20 17:40 18401.痛点 feilong-spring 项目子项目很多 ... -
自定义maven plugins, 找不到org.slf4j.helpers.MessageForm 问题(ClassNotFoundException)
2015-06-22 02:09 2157今天升级了下我的maven, 从3.2.1 升级到 3.3 ... -
【飞天奔月出品】maven create-from-project 之 multi-module project
2015-03-27 14:13 1356背景: 经常要搭建新项目架构,以前都是copy p ... -
使用ant javadoc 命令个性化生成项目javadoc (主要参数说明)
2012-10-14 16:57 6343以前一直使用eclipse 自带的 export 的功能导出j ... -
一步一步升级配置7:开发环境使用maven tomcat plugin 来运行项目,大幅度提到开发效率
2012-08-31 17:00 4355背景: 目前官方商 ... -
maven pom中使用 native2ascii-maven-plugin 插件来进行properties转码
2012-03-23 11:20 5836背景: 原先开发的时候,需要 ant运行 copyResou ...
相关推荐
maven下通用的ant配置文件,只要0积分。只需修改11行末尾的target/自己的工程名即可。
达梦数7据库j驱动包及方言包,maven依赖jar包,DM达梦数据库jdbc-jar包dialect方言jar包
elasticsearch 5.4 maven依赖jar包 x-pack-transport5.4.0所有依赖jar包
这是一个springboot+maven写的demo,主要演示springboot项目通过maven插件,将依赖与配置文件打包到jar包外部,实现灵活的项目管理.仅供参考学习
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar
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依赖
maven打包 maven打jar包详细步骤
maven依赖本地非repository中的jar包
maven-jar-plugin-3.1.1.jar
Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中
标签:ant-1.6.5.jar.zip,ant,1.6.5,jar.zip包下载,依赖包
maven-jar-plugin-2.6.jar。解决maven官网上下载不下来或者下载速度慢的问题。
JSONObject对象相关的jar包依赖,一共有6个;还有maven环境下管理的jar包
maven依赖库,里面含有较为全面的jar包,如果maven无法自动下载依赖库,可手动导入依赖库;该压缩包解压后可以直接在maven项目中指定路径使用。
java运行依赖jar包
2017年12月所有最新版本,SSM jar包 和maven文件,以及3个配置文件 已经过测试哦.......maven 什么的 都可以用
maven-jar-plugin-2.3.2.jar
批量导入maven本地jar包
最近在做项目用到jasperreports6.5.0,该库依赖itext2.7.1版本比较旧,又不能升级itext为5.0以上。照成中文无法显示,因此打了两个字体库兼容itext2.7.1。项目完美显示中文字体。 使用方法: 1、将字体jar文件拷贝...
主要介绍了Maven发布Jar包中文乱码解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧