A custom Weld Java SE startup class
Posted by starksm64 in Scott Stark's Blog on Aug 19, 2012 12:54:54 PMI was working with Weld framework in a Java SE environment largely through the IDE, and had found posts about using the org.jboss.weld.environment.se.StartMain class to bootstrap Weld from within Java SE, but I wanted more control over which class was targeted as the prescribed approach of having a ContainerInitialized event listener ala:
public class TestMain { public void main(@Observes ContainerInitialized event, @Parameters List parameters) { System.out.printf("TestMain.main called, parameters=%s\n", parameters); } }
would result in every such listener in the ide classpath being called. I took the simple StartMain bootstrap code and created the following CustomWeldStartMain that accepts the name of the class to use as the post bootstrap entry point:
package com.si.weld; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; /** * A weld startup class for use in Java SE environment * * @author Scott Stark * @version $Revision:$ */ public class CustomWeldStartMain { /** * The entry point to the weld initialization * @param args - the * [0] = the class name of WeldMain class to bootstrap * [1..n] = the args to pass to the WeldMain.main(String...) method * @throws Exception */ public static void main(String[] args) throws Exception { // Need at least one arg giving the WeldMain implementation class name if(args.length == 0) { throw new IllegalStateException("Non-zero arguments required, first argument must be main class name"); } // Load the class to use as the main class String mainClassName = args[0]; Class<?> mainClass = CustomWeldStartMain.class.getClassLoader().loadClass(mainClassName); if(WeldMain.class.isAssignableFrom(mainClass) == false) { throw new IllegalStateException(mainClassName+"does not implement WeldMain"); } Class<WeldMain> weldMainClass = (Class<WeldMain>) mainClass; // Standard Weld bootstrap from org.jboss.weld.environment.se.StartMain Weld weld = new Weld(); WeldContainer weldContainer = weld.initialize(); WeldMain main = weldContainer.instance().select(weldMainClass).get(); // Add the SE shutdown hook Runtime.getRuntime().addShutdownHook(new ShutdownHook(weld)); // Call the WeldMain.main() entry point String[] subargs = new String[args.length-1]; System.arraycopy(args, 1, subargs, 0, args.length-1); main.main(subargs); } static class ShutdownHook extends Thread { private final Weld weld; ShutdownHook(final Weld weld) { this.weld = weld; } public void run() { weld.shutdown(); } } } package com.si.weld; /** * A simple interface defining the Weld post bootstrap main entry point. * * @author Scott Stark * @version $Revision:$ */ public interface WeldMain { public void main(String[] args) throws Exception; }
Here is a sample test WeldMain entry point that is invoked when running from within the ide using a
package test.com.si.weld; import com.si.weld.WeldMain; import javax.inject.Singleton; import java.util.Arrays; /** * A minimalist WeldMain implementation * * @author Scott Stark * @version $Revision:$ */ @Singleton public class TestMain2 implements WeldMain { public void main(String[] args) { System.out.printf("TestMain2.main(%s)\n", Arrays.asList(args)); } }
To run this class, I setup a run configuration that specified com.si.weld.CustomWeldStartMain as the main class, and included test.com.si.weld.TestMain2 as the first program argument, with arg2, arg3 as the second argument. Running this within the ide produced:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -Didea.launcher.port=7537 "..." com.intellij.rt.execution.application.AppMain com.si.weld.CustomWeldStartMain test.com.si.weld.TestMain2 arg2 arg3
45 [main] INFO org.jboss.weld.Version - WELD-000900 1.1.9 (Final)
263 [main] INFO org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
TestMain2.main([arg2, arg3])
Process finished with exit code 0
Maybe this is of general interest as an alternative StartMain?
Comments