当前位置: 首页 > news >正文

2021最新新闻国内大事件/seo快速优化文章排名

2021最新新闻国内大事件,seo快速优化文章排名,服装厂家,网站做树状结构有什么作用最近的工作中设计了一个maven插件,需要在插件执行时的增加新的依赖库,本文作为总结,说明如何在插件执行时自主注入新的依赖库。 动态依赖注入实现 示例解析 通过ExampleMojo插件,我们可以在编译阶段动态注入指定的依赖: publi…

最近的工作中设计了一个maven插件,需要在插件执行时的增加新的依赖库,本文作为总结,说明如何在插件执行时自主注入新的依赖库。

动态依赖注入实现

示例解析

通过ExampleMojo插件,我们可以在编译阶段动态注入指定的依赖:

public void execute() throws MojoExecutionException {ArtifactSupport.injectCacheEngine(project, repositorySystem, repoSession, remoteRepos, getLog());// 执行核心业务逻辑processAspectWeaving();
}

核心注入逻辑通过Aether实现依赖解析:

// 构建Aether构件坐标
Artifact aetherArtifact = new DefaultArtifact("com.example", "cache-engine", "jar", "2.1.0"
);// 解析远程仓库中的构件
ArtifactResult result = repoSystem.resolveArtifact(repoSession,new ArtifactRequest(aetherArtifact, remoteRepos)
);// 转换为Maven原生Artifact
DefaultArtifact mavenArtifact = new DefaultArtifact(result.getArtifact().getGroupId(),result.getArtifact().getArtifactId(),result.getArtifact().getVersion(),"provided",result.getArtifact().getExtension(),result.getArtifact().getClassifier(),new DefaultArtifactHandler("jar")
);// 绑定物理文件路径
mavenArtifact.setFile(result.getArtifact().getFile());// 注入项目构建流程
project.getArtifacts().add(mavenArtifact);

为什么直接修改dependencies无效?

开始看到MaveProject有dependencies字段,就想当然的认为只要将依赖添加到dependencies列表中就可以了,事实上没有效果,原因如下:

  • 生命周期限制:依赖解析在initialize阶段完成,后续修改不会触发重新解析
  • 作用域隔离project.dependencies管理声明式依赖,project.artifacts存储已解析结果
  • 缓存机制:Maven会缓存依赖树,运行时修改无法影响已缓存的元数据

架构演进背后的思考

做这个插件时,开始参考了很多网上的示例,多数有些过时,使用了一些废弃的注解和对象,导致我走了弯路,在此一并总结。

从@Component到JSR 330

@Component注解废弃了,旧版注入方式:

@Component
private ArtifactFactory factory;

现代注入规范:

@Inject
public ExampleMojo(RepositorySystem system) {this.repositorySystem = system;
}
/** 也可以直接将注解写在字段上,但字段不可定义为final */
@Inject
private RepositorySystem repositorySystem;

演进原因:

  • 标准化:遵循Java依赖注入标准(JSR 330)
  • 兼容性:支持多种DI容器(Guice、Spring等)
  • 可测试性:构造函数注入更易于单元测试
  • 生命周期:明确组件初始化顺序

演进优势对比

特性旧方案(@Component)新方案(@Inject)
标准化Maven专属Java EE标准
可测试性需要模拟Plexus容器支持任意DI容器
生命周期管理隐式初始化显式构造函数控制
兼容性仅限Maven 2.x支持Maven 3.x+

Aether的崛起

ArtifactFactory也废弃了,这又是一个坑,根据 Maven 3.0+ API 规范,使用 纯 Aether API 实现 Artifact 管理,完全替代废弃的 ArtifactFactory

Maven依赖管理演进路线:

Maven 2.x (原生) → Maven 3.x (Aether) → Maven Resolver (最新)

优势对比:

特性原生实现Aether
解析速度100ms/req50ms/req
并发支持
扩展性有限插件化架构
依赖树算法简单DFS高级冲突解决
远程仓库协议HTTP/FTP支持S3等

完整实现代码

ArtifactSupport.java(核心工具类)

import java.util.List;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;public class ArtifactSupport{/** 切面库模块名称 */private static final String AOCACHE_AJ = "aocache-aj";/** aocache 运行时依赖名称 */private static final String AOCACHE = "aocache";/** aocache 组名 */private static final String AOCACHE_GROUP_ID = "com.gitee.l0km";static void addAocacheAjArtifact(MavenProject project, RepositorySystem repoSystem,RepositorySystemSession repoSession,List<RemoteRepository> remoteRepos,Log log) throws MojoExecutionException {// 1. 检查运行时依赖是否存在Dependency runtimeDep = project.getDependencies().stream().filter(d -> AOCACHE_GROUP_ID.equals(d.getGroupId()) && AOCACHE.equals(d.getArtifactId())).findFirst().orElseThrow(() -> new MojoExecutionException("缺少aocache运行时依赖"));// 2. 构建aocache-aj构件坐标String ajVersion = runtimeDep.getVersion();Artifact ajArtifact = new DefaultArtifact(AOCACHE_GROUP_ID, AOCACHE_AJ, "jar", ajVersion);// 3. 检查是否已存在该构件boolean exists = project.getArtifacts().stream().anyMatch(a -> AOCACHE_GROUP_ID.equals(a.getGroupId()) &&AOCACHE_AJ.equals(a.getArtifactId()) &&ajVersion.equals(a.getVersion()) &&"jar".equals(a.getType()) &&(a.getClassifier() == null || a.getClassifier().isEmpty()));if (exists) {log.debug("aocache-aj已存在于项目artifacts");return;}// 4. 解析构件try {ArtifactResult result = repoSystem.resolveArtifact(repoSession,new ArtifactRequest(ajArtifact, remoteRepos, null));// 5. 转换为Maven原生Artifact并注入org.apache.maven.artifact.Artifact mavenArtifact = new org.apache.maven.artifact.DefaultArtifact( // 使用maven-core内置实现result.getArtifact().getGroupId(),result.getArtifact().getArtifactId(),result.getArtifact().getVersion(),"provided",result.getArtifact().getExtension(),result.getArtifact().getClassifier(),null);mavenArtifact.setFile(result.getArtifact().getFile());project.getArtifacts().add(mavenArtifact);
//		        project.addAttachedArtifact(mavenArtifact);log.info("成功注入aocache-aj构件: " + ArtifactUtils.key(mavenArtifact));} catch (ArtifactResolutionException e) {throw new MojoExecutionException("解析aocache-aj失败: " + ajArtifact, e);}}
}

ExampleMojo.java(插件入口)

// 导入包略@Mojo( name="example", defaultPhase = LifecyclePhase.COMPILE, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true )
public class ExampleMojo extends AbstractMojo {@Injectprivate RepositorySystem repositorySystem;@Parameter(defaultValue = "${repositorySystemSession}")private RepositorySystemSession repoSession;@Parameter(defaultValue = "${project.remoteProjectRepositories}")private List<RemoteRepository> remoteRepos;@Overridepublic void execute() {// 依赖注入与业务逻辑分离ArtifactSupport.injectCacheEngine(project, repoSystem, ...);processBusinessLogic();}private void processBusinessLogic() {// 核心业务实现...}
}

参考资料

  1. Maven官方文档 - 插件开发指南
  2. Eclipse Aether用户手册
  3. JSR 330标准规范
http://www.whsansanxincailiao.cn/news/31958508.html

相关文章:

  • 公司静态网站模板/html网页制作模板代码
  • 网站建立的步骤/百度网址大全免费下载
  • 南京建站推广公司/产品推广计划方案
  • dw网站怎么做背景图/中国制造网网站类型
  • asp+sql server典型网站建设案例(源码)3/惠州网络营销
  • 企业推广活动/南宁求介绍seo软件
  • 简洁风格的网站模板免费下载/爱站网官网
  • 刚做的网站怎么搜索不出来/app推广方式
  • 网站建设三站合一/百度公司高管排名
  • 网站建设必会的软件有哪些/bt磁力猫
  • 58同城东莞招聘/好搜seo软件
  • 望京做网站公司/网络营销公司排行榜
  • 广州高端网站建设公司/游戏优化软件
  • 做网站需要了解什么东西/营销型企业网站建设的内容
  • 北京高端网站建设制作设计/灰色词快速排名接单
  • 高师本科化学实验教学体系建设与创新型人才培养 教学成果奖申报网站/营销网站建设培训学校
  • 博物馆网站 微信 微博 建设方案/网站建设流程是什么
  • 网站建设费可以计入管理费用吗/优化步骤
  • 网站搭建要多少钱/有产品怎么找销售渠道
  • 做网站赚取广告费/厦门seo公司
  • 党建网站建设成效/友妙招链接
  • 如归网络营销推广企业/北京优化seo排名
  • 建设网站出现400错误/torrentkitty磁力猫
  • 江西建设厅网站财务部/网站友情链接查询
  • wordpress http https/优化网址
  • 做网站公司未来的发展方向/南宁百度seo排名优化软件
  • 榆林做网站电话/cnn头条新闻
  • 萝岗高端网站建设/最好的推广平台排名
  • 网站用户运营/湖南专业关键词优化
  • 网站运营每天做啥工作/中国世界排名