JD的云引擎可以提供一个网站搭建的Java编译发布环境。但是所有源码都要放在下面。 我只是想把JD提供的环境作为一个门面,来展现内容。自己的东西自己管理。(网上解决是使用submodule,强烈推荐看看.戳)
我建了一个源码库flickrUpload在Github上,如果我想把它放到JD的云引擎上运行,需要复制代码然后再提交一次到jd-code。但不想源码版本库分支混乱,并且JD云上仅仅是为了展示,不进行修改。最终实现使用Maven来检出依赖项目,再进行编译打包实现在JD的展示功能。
本地环境使用scm和antrun插件,实现先更新依赖源码再打包
检出依赖源码库
由于对Maven不太熟悉,首先想到的是额外执行系统的命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
根据profile来配置来判断环境,执行特定的命令(bat/sh)。
- Windows脚本
1 2 3 4 |
|
- Linux脚本
1 2 3 |
|
测试在本地window已经能实现自己的要求,能把checkout项目的内容放在了发布包的根目录下面。
执行mvn package
后的target目录结构如下:
源码库路径重定位
发布时把源码库文件放置到war的根目录下面,有考虑过COPY:如Copy-maven-plugin,还有如下outputDirectory的形式(参考):
<project> ... <build> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <!-- here the phase you need --> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/extra-resources</outputDirectory> <resources> <resource> <directory>src/non-packaged-resources</directory> <filtering>true</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> ... </build> ... </project>
最终实现
上面就要解决两个问题:源码检出和资源重定位。
后面发现war可以包含特定目录的资源,资源重定位实现就用war的webResources实现了。 同时为了把检出源码的清理工作提取到clean任务下,添加使用antrun插件。同时发现scm插件就实现了检出源码的功能maven-scm-plugin。
使用antrun和scm完全使用Maven实现,最终的插件配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
现在使用mvn clean package
就可以实现先checkout项目再打包发布了。最终效果全部使用maven实现,无需额外考虑平台之间的差异处理。
JD的云引擎Maven编译不支持scm插件
不支持的插件:’maven-scm-plugin’ 在pom文件中被发现,编译将终止,请检查并更新代码!
然后部署到云引擎的时刻,发现antrun和scm的插件都不行,exec也不行! 也尝试过submodule,但是邮件JD的回复说是云上引用内部的才有效!
发布到云引擎最终还是用最土的方法,先删除旧的版本库,然后检出,在提交到云引擎的版本库中。
1 2 3 4 5 |
|
其他
- 子模块基本操作命令
$ git submodule add git@github.com:josephj/javascript-platform-yui.git static/platform
$ git add .gitmodules static/platform $ git submodule init$ cd static/platform
$ git pull origin master
$ cd ../../
$ git add static/platform
$ git commit -m “static/platform submodule updated”$ git submodule init
$ git submodule update$ cd static/platform
$ vim README # 做些修改
$ git add README
$ git commit -m “Add comments”
$ git push
$ git add static/platform
$ git commit -m ‘Submodule updated
$ git push$ git rm –cached [欲移除的目錄]
$ rm -rf [欲移除的目錄]
$ vim .gitmodules
$ vim .git/config
$ git add .gitmodules
$ git commit -m “Remove a submodule”
$ git submodule sync
参考
- Maven plugin中的lifecycle、phase、goal、mojo概念及作用的理解
- How to use master pom file to checkout all modules of a web application and build all modules 这个和我要实现的问题类似
- Ant task to run an Ant target only if a file exists?
- MAVEN常用插件 牛逼啊!
- maven-antrun-plugin skip target if any of two possible conditions holds
- How to execute tasks conditionally using the maven-antrun-plugin?
- maven-scm-provider-jgit
- Git Submodule 的認識與正確使用! 非常详尽
–END