从任意 url 动态加载 jar
Dynamically loading jar from arbitrary url
最近 AWS Lambda 添加了对 Java 的支持。
虽然这是个好消息,但它对代码大小(压缩后 50MB)有相当严格的限制。虽然这对于其他语言可能没问题,但 Java uberjars 可以轻松击败它。
所以我一直在考虑拥有一个小型加载器的想法,该加载器可以在运行时从其他地方加载一个更大的 jar。 (暂时搁置这是否是个好主意)。
根据我的初步研究,自定义 Class 加载程序似乎是可行的方法。这对于 AWS Lambda 来说可能是行不通的。
还有其他创造性的方法可以实现吗?
我认为 ClassLoader
,更准确地说 URLClassLoader
是可行的方法,我不知道有任何其他在运行时加载代码的解决方案。
class 加载程序甚至不必自定义。它只需几行代码即可工作,如 this post.
中所示
如果您要加载的 jar 文件满足您的应用程序的特定服务,也请考虑方便的 ServiceLoader
。它的工作原理相同(实际上,您可以直接将 ClassLoader
传递给它),但它可以透明地从动态加载的库中实例化对象。否则,你将不得不亲自动手,使用类似的东西:
Object main = loader.loadClass("Main", true).newInstance();
最近 AWS Lambda 添加了对 Java 的支持。
虽然这是个好消息,但它对代码大小(压缩后 50MB)有相当严格的限制。虽然这对于其他语言可能没问题,但 Java uberjars 可以轻松击败它。
所以我一直在考虑拥有一个小型加载器的想法,该加载器可以在运行时从其他地方加载一个更大的 jar。 (暂时搁置这是否是个好主意)。
根据我的初步研究,自定义 Class 加载程序似乎是可行的方法。这对于 AWS Lambda 来说可能是行不通的。
还有其他创造性的方法可以实现吗?
我认为 ClassLoader
,更准确地说 URLClassLoader
是可行的方法,我不知道有任何其他在运行时加载代码的解决方案。
class 加载程序甚至不必自定义。它只需几行代码即可工作,如 this post.
中所示如果您要加载的 jar 文件满足您的应用程序的特定服务,也请考虑方便的 ServiceLoader
。它的工作原理相同(实际上,您可以直接将 ClassLoader
传递给它),但它可以透明地从动态加载的库中实例化对象。否则,你将不得不亲自动手,使用类似的东西:
Object main = loader.loadClass("Main", true).newInstance();