package com.vip.saturn.job.plugin.maven.utils; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.net.URL; import java.text.ParseException; import org.apache.ivy.Ivy; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; /** * * @author xiaopeng.he * */ public class MavenProjectUtils { private final Log logger; private final MavenProject mavenProject; private final String localRepository; private final String fileSeparator = System.getProperty("file.separator"); private final String userHome = System.getProperty("user.home"); private final String ivyCache = userHome + fileSeparator + ".ivy_cache"; private final String defaultM2Repository = userHome + fileSeparator + ".m2" + fileSeparator + "repository"; public MavenProjectUtils(MavenProject mavenProject, Log log) { this.logger = log; this.mavenProject = mavenProject; this.localRepository = getLocalRepository0(); } public String getLocalRepository() { return localRepository; } public IvyGetArtifact getIvyGetArtifact() throws ParseException, IOException { File cacheDirectory = new File(ivyCache);// ivy下包缓存目录 if (!cacheDirectory.exists()) { cacheDirectory.mkdirs(); } URL settingsURL = MavenProjectUtils.class.getClassLoader().getResource("ivysettings.xml"); Ivy ivy = Ivy.newInstance(); ivy.getSettings().setDefaultCache(cacheDirectory); ivy.getSettings().setVariable("ivy.local.default.root", localRepository); ivy.getSettings().load(settingsURL); return new IvyGetArtifact(logger, ivy); } /** * Get local maven repo location */ private String getLocalRepository0() { String localRepositoryDir = null; try { Field projectBuilderConfiguration = mavenProject.getClass().getDeclaredField("projectBuilderConfiguration"); projectBuilderConfiguration.setAccessible(true); Object projectBuilderConfiguration_object = projectBuilderConfiguration.get(mavenProject);// org.apache.maven.project.DefaultProjectBuildingRequest Field localRepository = projectBuilderConfiguration_object.getClass().getDeclaredField("localRepository"); localRepository.setAccessible(true); Object localRepository_object = localRepository.get(projectBuilderConfiguration_object); Object basedirParent = null; try { Field userLocalArtifactRepository = localRepository_object.getClass().getDeclaredField( "userLocalArtifactRepository");// for maven 3.1.1 userLocalArtifactRepository.setAccessible(true); basedirParent = userLocalArtifactRepository.get(localRepository_object); } catch (Exception e) { basedirParent = localRepository_object;// for maven 3.2.3 } Field basedir = basedirParent.getClass().getDeclaredField("basedir"); basedir.setAccessible(true); localRepositoryDir = (String) basedir.get(basedirParent); } catch (Exception e) { logger.warn("Maven's version is not suitable, use the default local maven repository"); } return localRepositoryDir == null ? defaultM2Repository : localRepositoryDir;// default local maven dir } }