mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.my.plugin -DartifactId=plugin-api
package com.my.plugin; public interface Plugin { public Integer perform(Integer param1, Integer param2); }
mvn clean install
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.my.plugin -DartifactId=sum-plugin
<dependency> <groupId>com.my.plugin</groupId> <artifactId>plugin-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
package com.my.plugin.impl; public class SumPlugin implements Plugin { @Override public Integer perform(Integer param1, Integer param2){ return param1 + param2; } }
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.my.plugin -DartifactId=app
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.compiler.version>1.6</project.compiler.version> <aetherVersion>0.9.0.M2</aetherVersion> <mavenVersion>3.1.0</mavenVersion> <wagonVersion>1.0</wagonVersion> </properties>
<dependency> <groupId>com.my.plugin</groupId> <artifactId>plugin-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- COMMONS --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- AETHER --> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-api</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-util</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-impl</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-connector-file</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-connector-asynchttpclient</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-connector-wagon</artifactId> <version>${aetherVersion}</version> </dependency> <dependency> <groupId>io.tesla.maven</groupId> <artifactId>maven-aether-provider</artifactId> <version>${mavenVersion}</version> </dependency> <dependency> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ssh</artifactId> <version>${wagonVersion}</version> </dependency> <dependency> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-file</artifactId> <version>${wagonVersion}</version> </dependency> <dependency> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-http</artifactId> <version>${wagonVersion}</version> </dependency> <dependency> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-http-lightweight</artifactId> <version>${wagonVersion}</version> </dependency>
Dependency dependency = new Dependency(new DefaultArtifact("com.my.plugin:plugin-sum:jar:1.0-SNAPSHOT"), "compile"); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot(dependency); // this will collect the transitive dependencies of an artifact and build a dependency graph DependencyNode node = repositorySystem.collectDependencies(repoSession, collectRequest).getRoot(); DependencyRequest dependencyRequest = new DependencyRequest(); dependencyRequest.setRoot(node); // this will collect and resolve the transitive dependencies of an artifact DependencyResult depRes = repositorySystem.resolveDependencies(repoSession, dependencyRequest); List<ArtifactResult> result = depRes.getArtifactResults();
public class ManualWagonProvider implements WagonProvider { public Wagon lookup(String roleHint) throws Exception { if ("file".equals(roleHint)) { return new FileWagon(); } else if (roleHint != null && roleHint.startsWith("http")) { // http and https return new HttpWagon(); } return null; } public void release(Wagon wagon) { // no-op }
public class DependencyResolver { public static final String MAVEN_CENTRAL_URL = "http://repo1.maven.org/maven2"; public static class ResolveResult { public String classPath; public List<ArtifactResult> artifactResults; public ResolveResult(String classPath, List<ArtifactResult> artifactResults) { this.classPath = classPath; this.artifactResults = artifactResults; } } final RepositorySystemSession session; final RepositorySystem repositorySystem; final List<String> repositories = new ArrayList<String>(); public DependencyResolver(File localRepoDir, String... repos) throws IOException { repositorySystem = newRepositorySystem(); session = newSession(repositorySystem, localRepoDir); repositories.addAll(Arrays.asList(repos)); } public synchronized ResolveResult resolve(String artifactCoords) throws Exception { Dependency dependency = new Dependency(new DefaultArtifact(artifactCoords), "compile"); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot(dependency); for (int i = 0; i < repositories.size(); ++i) { final String repoUrl = repositories.get(i); collectRequest.addRepository(i > 0 ? repo(repoUrl, null, "default") : repo(repoUrl, "central", "default")); } DependencyNode node = repositorySystem.collectDependencies(session, collectRequest).getRoot(); DependencyRequest dependencyRequest = new DependencyRequest(); dependencyRequest.setRoot(node); DependencyResult res = repositorySystem.resolveDependencies(session, dependencyRequest); PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); node.accept(nlg); return new ResolveResult(nlg.getClassPath(), res.getArtifactResults()); } private RepositorySystemSession newSession(RepositorySystem system, File localRepoDir) throws IOException { DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); LocalRepository localRepo = new LocalRepository(localRepoDir.getAbsolutePath()); session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); return session; } private RepositorySystem newRepositorySystem() { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.setServices(WagonProvider.class, new ManualWagonProvider()); locator.addService(RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class); return locator.getService(RepositorySystem.class); } private RemoteRepository repo(String repoUrl) { return new RemoteRepository.Builder(null, null, repoUrl).build(); } private RemoteRepository repo(String repoUrl, String repoName, String repoType) { return new RemoteRepository.Builder(repoName, repoType, repoUrl).build(); } }
DependencyResolver resolver = new DependencyResolver(new File(System.getProperty("user.home") + "/.m2/repository")); DependencyResolver.ResolveResult result = resolver.resolve("com.my.plugin:plugin-sum:jar:1.0-SNAPSHOT"); for (ArtifactResult res : result.artifactResults) { System.out.println(res.getArtifact().getFile().toURI().toURL()); }
file:/home/smecsia/.m2/repository/com/my/plugin/plugin-sum/1.0-SNAPSHOT/plugin-sum-1.0-SNAPSHOT.jar file:/home/smecsia/.m2/repository/com/my/plugin/plugin-api/1.0-SNAPSHOT/plugin-api-1.0-SNAPSHOT.jar
List<URL> artifactUrls = new ArrayList<URL>(); for (ArtifactResult artRes : resolveResult.artifactResults) { artifactUrls.add(artRes.getArtifact().getFile().toURI().toURL()); } final URLClassLoader urlClassLoader = new URLClassLoader(artifactUrls.toArray(new URL[artifactUrls.size()]), getSystemClassLoader());
Class<?> clazz = urlClassLoader.loadClass("com.my.plugin.SumPlugin"); final Plugin pluginInstance = (Plugin) clazz.newInstance(); System.out.println("Result: " + pluginInstance.perform(2, 3));
Source: https://habr.com/ru/post/218323/
All Articles