最近,AWS Lambda添加了对Java的支持。 尽管这是个好消息,但它对代码的大小(压缩的50MB)造成了相当严格的限制。尽管这对于其他语言可能很好,但是Java uberjars可以轻松击败它。
因此,我一直在考虑使用一个小型加载程序在运行时从其他地方插入一个较大的jar的想法。(暂时不要考虑这是个好主意)。
从我的初步研究看来,定制类加载器是必经之路。对于AWS Lambda来说,这可能是不可行的。
还有其他创意方法可以实现吗?
我认为ClassLoader,更准确地说URLClassLoader,是要走的路,而且我不知道在运行时加载代码的任何其他解决方案。
ClassLoader
URLClassLoader
类加载器甚至不必自定义。正如本文所展示的,它只需要几行代码即可工作。
如果您将加载的jar文件为您的应用程序提供了特定的服务,也请考虑使用方便ServiceLoader。它的工作原理相同(实际上,您可以直接将其传递给a ClassLoader),但是使从动态加载的库实例化对象透明化。否则,您将需要使用以下方法使您的手变脏:
ServiceLoader
Object main = loader.loadClass("Main", true).newInstance();