原文链接 译者:carvendy
Maven 类加载指南
这里描述的类加载是Maven版本在 2.0.6以上的。
概述
- System Classloader
- Core Classloader
- Plugin Classloaders
- Custom Classloaders
1. System Classloader
当我们创建类加载器时,Maven 使用Classworlds 作为类加载框架。在**${maven.home}/boot**目录你会看到一个jar,一个Classworlds用来制作类加载图的jar。 Classworlds jar包是java CLASSPATH的唯一节点和Classworlds在Classworlds技术中构建其他类加载器和领域。
一个Ant脚本将展示系统加载器的内容:
<target name="info">
<echo>java.class.path=${java.class.path}</echo>
</target>
2. Core Classloader
第二个类加载器下的图包含Maven的核心需求。更为准确地说,核心类加载器在**${maven.home}/lib**已经有类库了。一般来说这就是Maven的类库,例子:实例 MavenProject 属于这类加载器。我们希望在未来进一步为Maven api和系统在运行时可以选择的实现类。
你可以给类加载器加节点通过扩展。这里一样加载这**${maven.home}/lib **和因此可用于maven核心代码和插件,所有当前的和后面的项目(在未来,我们计划剥离它。)
3. Plugin Classloaders
在这以后,每一个插件有自己的类加载器即Maven核心的类加载器的一个子类。这些类是从类加载器找到插件的依赖关系列表。
用户可以新增依赖关系到这个类加载器,通过在他们的项目pom.xml中增加一个插件的依赖关系到**plugins/plugin**。这里是增加一个 ant-nodeps 到 Antrun插件的类加载器和有可能使用 使用附加/可选的Ant任务:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
...
</plugin>
插件可以检查运行时有效的类路径通过 **${plugin.artifacts}**或 ${plugin.artifactMap}的表达会有一个list或map,分别地,解决注射工件来自于PluginDescriptor。
请用笔记插件类加载器既不包含项目的依赖关系也不包含它构建输出。相反,插件可以查询项目编译,运行和测试时候可以结合来自**Mojo API Specification的mojo注解requiresDependencyResolution**获取类文件路径。例如,设置一个mojo运行的 @requiresDependencyResolution可以查询运行时的项目类路径当它可以创建更多的类装载器。
当一个构建插件被执行,这个线程容器类加载器会被设置到插件加载器。
自定义类加载器
插件可以自由地创建更多类加载器在它们自己的判断下。作为一个例子,一个插件可以创建一个绑定插件类路径和项目类路径的类加载器。
重要的是理解插件类加载器不能从任何自定义的类加载器中加载类。有些工厂模式需要。这里你必须在插件的类加载器展示之前将入类加入到它(插件的类加载器)中。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/100243.html