zeroturnaround / zt-exec

ZeroTurnaround Process Executor

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ProcessExecutor NoSuchFieldError: NULL_OUTPUT_STREAM

stevedefazio opened this issue · comments

When I try to call the below class, I get java.lang.NoSuchFieldError: NULL_OUTPUT_STREAM and I'm not sure why. I've tried the various versions of Slf4jStream.ofClass()/of(getClass()), etc. This is written in groovy, and it's being called from my test suite. I'd be grateful for any suggestions as to what might be going wrong.

    class ProgramRunner{

	final Logger log = LoggerFactory.getLogger(getClass());
	

	public void runProcess(List<String> command, Map<String, String> environment, Long timeout){
		new ProcessExecutor().command(job.command)
		.redirectOutput(Slf4jStream.of(log).asInfo())
		.redirectError(Slf4jStream.of(log).asError())
		.timeout(command.timeout ?: Long.MAX_VALUE, TimeUnit.SECONDS)
		.environment(command.environment ?: new HashMap<String, String>())
		.execute();
	}
}

Please paste the full stacktrace here. I expect that detecting the caller class might not work with Groovy. However if you explicitly provide the Logger category class it should work fine.

java.lang.NoSuchFieldError: NULL_OUTPUT_STREAM
at org.zeroturnaround.exec.ProcessExecutor.redirectOutput(ProcessExecutor.java:487)
at org.zeroturnaround.exec.ProcessExecutor.(ProcessExecutor.java:158)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:232)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:236)
at com.vanguard.fig.batch.actions.ProgramRunner.runProcess(ProgramRunner.groovy:53)
at com.vanguard.fig.batch.actions.ProgramRunner$runProcess.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:138)
at com.vanguard.fig.batch.actions.AxiomExport.execute(AxiomExport.groovy:52)
at com.vanguard.fig.batch.actions.Action$execute.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at com.vanguard.fig.batch.actions.Action$execute.call(Unknown Source)
at com.vanguard.fig.batch.core.DataExchanger$_run_closure1.doCall(DataExchanger.groovy:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
at groovy.lang.Closure.call(Closure.java:423)
at groovy.lang.Closure.call(Closure.java:439)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2027)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2012)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2053)
at org.codehaus.groovy.runtime.dgm$162.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
at com.vanguard.fig.batch.core.DataExchanger.run(DataExchanger.groovy:46)
at com.vanguard.fig.batch.core.DataExchanger$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
at com.vanguard.fig.batch.core.Runner.run(Runner.groovy:72)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760)
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
at org.springframework.boot.SpringApplication$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
at com.vanguard.fig.batch.core.Runner.main(Runner.groovy:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
at com.vanguard.fig.batch.rmsa.DataExchangerStepDef.theJobIsExecutedOnADailyBasis(DataExchangerStepDef.groovy:104)
at ✽.When we run our program(LoadAxiomReportToRMSA.feature:178)

It's pretty simple field access: https://github.com/zeroturnaround/zt-exec/blob/master/src/main/java/org/zeroturnaround/exec/ProcessExecutor.java#L487

Please try to just call NullOutputStream.NULL_OUTPUT_STREAM and see if it fails.

Here's what I get when I just try to call that directly.
Caused by: groovy.lang.MissingPropertyException: No such property: NULL_OUTPUT_STREAM for class: org.apache.commons.io.output.NullOutputStream

So you have different version of the Commons IO library. zt-exec depends on version 1.4. You have probably an older version.

That was it! I had another dependency that was providing the older version of Commons IO, so I just moved zt-exec to the top of my maven dependencies and everything worked great. Thank you!!

You're welcome!