由于最近项目的需要,需要对源maven工程中的指定的接口文件进行打包并上传至maven仓库。基本用过maven的都知道:我们之前在使用maven打包的时候,往往就是对整个project进行打包。那么如果要实现按需打包,最头疼的问题就是工程文件之间的依赖问题------Maven在对整个工程进行打包的时候,工程之间的依赖可以由maven打包机制自动解决(其实是对整个工程进行打包,依赖可以在整个工程目录下进行寻找)。如果对指定的接口进行打包,必须要限定打包的目录,即指定接口所在的目录,但是指定目录以后,如果接口依赖的文件与接口不在同一个包下,则会出现依赖文件无法找到的错误。 如果不指定接口所在的目录,则会将多余的接口文件打包进jar包,无法实现按需打包的需求。这里所说的按需打包的按需是指用户需要的接口,而对于实体类则不仅仅是接口依赖的实体类,其他的实体类也会打进jar包,如果要实现只打进接口依赖的实体类的话,那么难度就很大了。分以下两种方法来提出我的解决办法:第一种是单工程文件:即整个工程仅有一个pom.xml文件。
对于这种单工程文件实现按需打包其实是比较麻烦的,解决的方案就是使用了build-helper-maven-plugin这个打包插件,使用这个插件,我们可以自己定义多个打包目录,这样的话便可以实现maven打包指定目录下的接口文件。
<build>
<sourceDirectory>${basedir}/src/main/java/com/com/heihei/haha</sourceDirectory>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${basedir}/src/main/java/com/haha/heihei</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我们可以在
sourceDirectory以及source标签中添加接口所在的目录以及所有的实体类所在的目录,由于maven工程都是按照一定的目录结构来构建,得到实体类的目录应该不是什么难事,当然只能适配某个工程。当然在此之前还需要解析指定接口所在的目录,这就需要使用java doclet来解析源工程文件,获取接口所在的路径。至于怎么去遍历工程文件去删除多余的接口,这就考察对于java文件的操作了,在这就不在赘述。在删除了多余的接口之后,并在pom文件中添加接口与实体类所在的目录之后,便可以执行 mvn package命令进行打包了。但是这样的文件还是不能使用,因为仅仅是打包成功了,但是并没有将接口所依赖的文件打入jar包之中,在使用jar包的时候,还是会报出依赖类找不到的错误。我们还需要使用maven-dependency-plugin和maven-assembly-plugin插件将依赖的文件拉取到jar包之中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass/>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
这样处理之后我们的生成的jar才可以真正的使用。
第二种是对父子工程进行打包:一个父工程下有多个子工程,每一个子工程都有自己的pom.xml文件,父工程还有一个总的pom.xml文件。
对于这种父子工程的进行接口按需打包,首先需要明白父工程与子工程是如何通过pom文件进行关联的,其实比较简单。通过以下三步就可以:
1.在父工程的pom文件中有modules标签,我们只需要在modules标签中添加module标签,module标签的内容即子工程的名字,
2.将父工程packing标签的内容设置为pom
3.在子工程中添加上parent标签,这样在执行父工程的pom文件的时候,在父工程中配置的module的子工程也会执行。这样便实现了父工程与子工程的联动。
这样的话为了实现按照所需接口进行打包,需要进行一下几步操作:
1.获取指定打包接口所在的子工程的名
2.获取指定打包接口所在的子工程的pom文件中依赖的子工程的名字,比如子工程A依赖了子工程B中的某个文件,这样的话子工程A中会添加一条dependency信息,其中的artifactId内容子工程的名字。
3.将要打包的子工程名以及依赖的子工程名一块添加进父工程的模块之中,这样在打包的时候,接口所在的模块会在父工程的pom文件modules中找到它依赖的模块,这样就不会报出依赖的类找不到错误了。
4.删除多余子工程下的多余的接口文件,仅保留实体类文件。
5.删除指定接口所在的子工程下的多余的接口文件。通过4、5两步,就不会将多余的接口文件打入jar包
6.由于在执行mvn deploy命令的时候,会将父工程modules中的模块全部上传至maven仓库,这样的话会将多余的jar包上传至maven仓库,这样的话需要向依赖的子工程的依赖文件中添加插件maven-deploy-plugin,这样的话就不会将其上传至maven仓库。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
在添加插件的时候,要注意一下,如果依赖的子工程也是要打包接口所在的子工程,那么就不能添加这个插件。当然为了保证jar包可用,还是要在父工程的pom文件中添加
maven-dependency-plugin
和
maven-assembly-plugin
插件信息。
这样便可以实现父子工程的按需打包接口。
由于项目保密需要,具体的代码实现以及具体细节不予给出,如果博友有其他好的方式,欢迎留言交流。