使用静态工厂方法时,fat jar中的主类失败,但在IDE中工作正常

问题描述 投票:0回答:1

我有一个小项目,我正在使用shadowJar创建一个从命令行运行的fatjar ..

主类入口点使用这样的静态工厂方法获取项目中的类

static void main (args){


MessageSystemClient mclient = MessagePlatformFactoryProducer.getFactory().getMessagePlatformInstance("WLS")

println "howdi "....
}

当我在命令行运行胖罐时,我得到一个错误

PS D:\Intellij-projects\message-platform-client\build\libs> java -jar message-platform-client-1.0-SNAPSHOT.jar --send "hello" -r
Exception in thread "main" java.io.FileNotFoundException: file:\D:\Intellij-projects\message-platform-client\build\libs\message-platform-client-1.0-SNAPSHOT.jar!\ApplicationConfig.groovy (The filename, directory name, or volume label syntax is incorrect)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at groovy.util.CharsetToolkit.<init>(CharsetToolkit.java:77)
        at org.codehaus.groovy.runtime.ResourceGroovyMethods.newReader(ResourceGroovyMethods.java:1741)
        at org.codehaus.groovy.runtime.ResourceGroovyMethods.getText(ResourceGroovyMethods.java:592)
        at org.codehaus.groovy.runtime.dgm$1013.doMethodInvoke(Unknown Source)
        at org.codehaus.groovy.reflection.GeneratedMetaMethod$Proxy.doMethodInvoke(GeneratedMetaMethod.java:83)
        at org.codehaus.groovy.runtime.metaclass.MethodMetaProperty$GetBeanMethodMetaProperty.getProperty(MethodMetaProperty.java:76)
        at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:63)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:298)
        at com.softwood.implementation.MessagePlatformFactory.getMessagePlatformInstance(MessagePlatformFactory.groovy:29)
        at com.softwood.client.AbstractMessagePlatformFactory$getMessagePlatformInstance.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at com.softwood.cli.Launcher.main(Launcher.groovy:40)

但是如果我注释掉静态工厂调用 - 并重新生成然后胖罐运行正常并将howdi打印到控制台。

如果我再次取消对工厂查找的注释,只需在IDE中运行Launcher类,代码就可以正常工作而没有任何问题

那么为什么它会像胖子一样失败,而是作为普通的项目呢?其次假设它与fatjar拉链方法有关 - 我如何克服这个?

我有一个项目的早期版本,它直接在项目类上调用静态方法,并且可以正常工作 - 所以问题在于fatjar中的静态工厂行为。

我试图使用加载类

Launcher.getClass().getClassLoader().loadClass ("<various factory classes etc>") 

这些类会加载好 - 但是工厂调用本身仍然会在堆栈跟踪中断开

请问有谁帮我解决这个问题?

static factory-pattern fatjar
1个回答
0
投票

找到它 - 在我的工厂方法中我正在进行这样的调用以加载configFile:

File configFile = new File(classLoader.getResource("ApplicationConfig.groovy")?.getFile()) 

但是根据related link,这不会在胖罐子里工作,因为罐子里没有完整的文件系统。

你要做的是使用如下行:

InputStream configStream = classLoader.getResourceAsStream("ApplicationConfig.groovy")

因为这将在jar中工作,并测试流是否为null(无法在fatjar中找到您的资源)或者您获得了流本身,您可以从文件中读取文本。

花了一段时间,但现在回想起来。

© www.soinside.com 2019 - 2024. All rights reserved.