[实践]使用JarJar优雅的发布依赖包
使用JarJar重封装减少发布包的依赖 Spring框架体积庞大、功能繁杂但是它的第三方依赖仅仅只有 其实在Spring的实现中也大量了使用 通过 Spring 的 API 文档可以清楚的看到这一点: Spring使用了Jar Jar Links实现这个功能。
task cglibRepackJar(type: Jar) { repackJar -> repackJar.baseName = "spring-cglib-repack" repackJarversion = cglibVersion doLast() { projectant { taskdef name: "jarjar", classname: "com.tonicsystems.jarjar.JarJarTask"classpath: configurationsjarjarasPath jarjardestfile: repackJararchivePath{ configurationscglibeach { originalJar -> zipfilesetsrc: originalJar) } // repackage net.sf.cglib => org.springframework.cglib rulepattern: "net.sf.cglib.**"result: "org.springframework.cglib.@1") // as mentioned above,transform cglib"s internal asm dependencies from // org.objectweb.asm => org.springframework.asm. Doing this counts on the // the fact that Spring and cglib depend on the same version of asm! rule"org.objectweb.asm.**""org.springframework.asm.@1") } } } } JarJar介绍
JarJar应用示例基于Ant使用JarJar一般情况下我们在 <target name="jar" depends="compile"> <jar jarfile="dist/example.jar"> <fileset dir="build/main"/> </jar> </target> 使用 <taskdef "jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="lib/jarjar.jar"<jarjar /> <!-- 包含一个第三方 jar 到项目中 --> <zipfileset src="lib/jaxen.jar"<!-- JarJar 提供了一个Pattern配置用来描述重命名--> <rule pattern="org.jaxen.**" result="org.example.@1"</jarjar> </target> 在上述的实例中我们将jaxen.jar 打包到自己的发布中,并且将以 基于Gradle使用JarJardependencies { // Use jarjar.repackage in place of a dependency notation. compile jarjarrepackage { from 'com.google.guava:guava:18.0' classDelete "com.google.common.base.**" classRename "com.google.**" "org.private.google.@1" } 基于命令行使用JarJar
java -jar jarjar.jar [help]
java -jar jarjar.jar strings <cp>
java -jar jarjar.jar find <level> <cp1> [<cp2>]
这个命令可以用来构建两个classpath 之间的依赖关系, java -jar jarjar.jar process <rulesFile> <inJar> <outJar> 这个命令可以讲
在Maven中实现JarJar功能Maven提供了一个 Plugin 来实现JarJar功能 <dependency> <groupId>org.sonatype.plugins</groupId> <artifactId>jarjar-maven-plugin</artifactId> <version>${jarjar-version}</version> </dependency> <!-- ...... --> <plugin> </groupId> </artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>jarjar</goal> </goals> <configuration> <includes> <include>asm:asm</include> <include>org.sonatype.sisu.inject:cglib</include> </includes> <rules> <rule> <pattern>org.objectweb.asm.**</pattern> <result>com.google.inject.internal.asm.@1</result> </rule> <pattern>net.sf.cglib.**<result>com.google.inject.internal.cglib.@1<keep> <pattern>com.google.inject.**</pattern> </keep> </rules> </configuration> </execution> </executions> </plugin> 限于个人技术能力、见识限制,还望各位看官不吝赐教。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |