我如何创建一个 object class 来执行从 Maven 存储库下载 .jar 依赖项
How can i create an object class to perform downloading of .jar dependencies from maven repository
根据上面的标题,我需要有关如何创建 object class 以执行从 Maven 存储库下载 .jar 依赖项的帮助。我有一个包含三个 class 的 JAR 文件,其中包括:CommandHandler.class; KeyStroke.class 和 Main.class 和每个 classes 都有需要免费下载的依赖项Maven 存储库。现在,我的问题是如何创建一个 object 来执行在我的主程序逻辑开始执行之前下载依赖项所需的所有必要任务。因为我相信如果没有依赖项,我上面的 classes 实现可能 运行 会出现严重的异常...请任何 help/suggestion/tips 将不胜感激。提前致谢。
如果你想在运行时动态加载一个jar,你可以按照operation.In下面的例子做,我假设依赖的jar是spring-context
,像这样:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.1.RELEASE</version>
<scope>provided</scope>
</dependency>
我得到了那个罐子的 url,http://maven.aliyun.com/nexus/content/groups/public/org/springframework/spring-context/4.3.1.RELEASE/spring-context-4.3.1.RELEASE.jar?spm=0.0.0.0.kG1Pdw&file=spring-context-4.3.1.RELEASE.jar
。
然后,有一个class Target
依赖于class DateFormatter
,它包含在spring-context
中,有一个方法是名为 start
.
import org.springframework.format.datetime.DateFormatter;
public class Target {
private static DateFormatter dateFormatter;
public void start(){
System.out.println(this.getClass().getClassLoader());
dateFormatter=new DateFormatter();
System.out.println(dateFormatter);
}
}
接下来,我们将上面的代码编译打包成一个名为target.jar
的jar,存放在D:\test\target.jar
.
接下来,我们应该在另一个 jar 中将 class 声明为 BootStrap
,它将调用 Target
instance.The [=25 的方法 start
=] class 将通过相同的 classloader
动态加载 target.jar
和 spring-context
jar 文件,这是一个 URLClassLoader
实例,因此,方法 start
in Target
实例可以访问 DateFormatter
class 中定义的 spring-context
.
public class BootStrap {
public static void main(String[] args) throws Exception{
URL url = new URL("http://maven.aliyun.com/nexus/content/groups/public/org/springframework/spring-context/4.3.1.RELEASE/spring-context-4.3.1.RELEASE.jar?spm=0.0.0.0.kG1Pdw&file=spring-context-4.3.1.RELEASE.jar");
URL url2= (new File("D:\test\target.jar").toURI().toURL());
URLClassLoader classLoader = new URLClassLoader(new URL[]{url,url2});
Class<?> clz = classLoader.loadClass("com.zhuyiren.Target");
Object main = clz.newInstance();
Method test = clz.getMethod("start");
test.invoke(main);
}
}
最后,运行BootStrap
主要method.There有两件重要的事情:
BootStrap
class和Target
class不属于同一个jar文件。
target.jar
未存储在 CLASSPATH
路径中。
我们可以看到结果:
java.net.URLClassLoader@e9e54c2
org.springframework.format.datetime.DateFormatter@4dd8dc3
我们成功访问了spring-context
jar文件中定义的DateFormatter
实例,spring-context
没有存储在CLASSPATH
中,甚至没有存储本地文件系统。
根据上面的标题,我需要有关如何创建 object class 以执行从 Maven 存储库下载 .jar 依赖项的帮助。我有一个包含三个 class 的 JAR 文件,其中包括:CommandHandler.class; KeyStroke.class 和 Main.class 和每个 classes 都有需要免费下载的依赖项Maven 存储库。现在,我的问题是如何创建一个 object 来执行在我的主程序逻辑开始执行之前下载依赖项所需的所有必要任务。因为我相信如果没有依赖项,我上面的 classes 实现可能 运行 会出现严重的异常...请任何 help/suggestion/tips 将不胜感激。提前致谢。
如果你想在运行时动态加载一个jar,你可以按照operation.In下面的例子做,我假设依赖的jar是spring-context
,像这样:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.1.RELEASE</version>
<scope>provided</scope>
</dependency>
我得到了那个罐子的 url,http://maven.aliyun.com/nexus/content/groups/public/org/springframework/spring-context/4.3.1.RELEASE/spring-context-4.3.1.RELEASE.jar?spm=0.0.0.0.kG1Pdw&file=spring-context-4.3.1.RELEASE.jar
。
然后,有一个class Target
依赖于class DateFormatter
,它包含在spring-context
中,有一个方法是名为 start
.
import org.springframework.format.datetime.DateFormatter;
public class Target {
private static DateFormatter dateFormatter;
public void start(){
System.out.println(this.getClass().getClassLoader());
dateFormatter=new DateFormatter();
System.out.println(dateFormatter);
}
}
接下来,我们将上面的代码编译打包成一个名为target.jar
的jar,存放在D:\test\target.jar
.
接下来,我们应该在另一个 jar 中将 class 声明为 BootStrap
,它将调用 Target
instance.The [=25 的方法 start
=] class 将通过相同的 classloader
动态加载 target.jar
和 spring-context
jar 文件,这是一个 URLClassLoader
实例,因此,方法 start
in Target
实例可以访问 DateFormatter
class 中定义的 spring-context
.
public class BootStrap {
public static void main(String[] args) throws Exception{
URL url = new URL("http://maven.aliyun.com/nexus/content/groups/public/org/springframework/spring-context/4.3.1.RELEASE/spring-context-4.3.1.RELEASE.jar?spm=0.0.0.0.kG1Pdw&file=spring-context-4.3.1.RELEASE.jar");
URL url2= (new File("D:\test\target.jar").toURI().toURL());
URLClassLoader classLoader = new URLClassLoader(new URL[]{url,url2});
Class<?> clz = classLoader.loadClass("com.zhuyiren.Target");
Object main = clz.newInstance();
Method test = clz.getMethod("start");
test.invoke(main);
}
}
最后,运行BootStrap
主要method.There有两件重要的事情:
BootStrap
class和Target
class不属于同一个jar文件。target.jar
未存储在CLASSPATH
路径中。
我们可以看到结果:
java.net.URLClassLoader@e9e54c2
org.springframework.format.datetime.DateFormatter@4dd8dc3
我们成功访问了spring-context
jar文件中定义的DateFormatter
实例,spring-context
没有存储在CLASSPATH
中,甚至没有存储本地文件系统。