Основной класс в толстом фляге терпит неудачу при использовании статического фабричного метода, но прекрасно работает в IDE - PullRequest
0 голосов
/ 14 марта 2019

У меня есть небольшой проект, который я использую 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 на консоль.

, если я снова раскомментирую поиск по фабрике и просто запустлю класс Launcher в IDE, код работает без проблем

, так почему он не работаеткак фуджар, но работает как обычный проект?во-вторых, предполагая, что это как-то связано с подходом fatjar zip - как мне преодолеть это?

У меня была более ранняя версия проекта, которая просто напрямую вызывала статические методы в классах проекта, и которая отлично работает как fatjar - такпроблема заключается в статическом поведении фабрики внутри fatjar.

я пытался загрузить классы, используя

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

классы загрузились бы нормально - но сам вызов фабрики все еще прерывается, как показано вышев трассировке стека

Может кто-нибудь помочь мне в этой проблеме, пожалуйста?

1 Ответ

0 голосов
/ 14 марта 2019

Нашел его - в моих фабричных методах я делал такой вызов для загрузки configFile:

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

Однако, согласно связанной ссылке , это не будет работать втолстый jar, так как в jar нет полной файловой системы.

Вам нужно использовать следующую строку:

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

, поскольку это будет работать в jar, и проверить, является ли потокnull (не удается найти ваш ресурс в фатжаре) или вы получаете сам поток, который вы можете прочитать из файла.

Это заняло некоторое время, но я думаю, что теперь снова.

...