第二个main()类没有看到在第一个main()类

时间:2018-01-06 02:57:49

标签: java nullpointerexception static

我正在开发一个需要两个main()类的应用程序,第一个用于实际应用程序,第二个用于JMX连接和管理。我面临的问题是,即使在确保执行第一个main()并初始化变量之后,当第二个main()运行但没有看到那些变量并抛出null异常时。

应用程序main():

public class GatewayCore {

private static Logger logger = Logger.getLogger(GatewayCore.class);
private static ThreadedSocketInitiator threadedSocketInitiator;**
private static boolean keepAlive = true;
//private static Thread mqConnectionManager;

public static void main(String args[]) throws Exception {
    __init_system();
    __init_jmx();
    __init_mq();
    while(keepAlive) {}
}

private static void __init_system() {
    try {
        logger.debug("__init_system:: loading configuration file 'sessionSettings.txt'");
        SessionSettings sessionSettings = new SessionSettings(new FileInputStream("sessionSettings.txt"));
        logger.info("\n" + sessionSettings);
        MessageStoreFactory messageStoreFactory = new FileStoreFactory(sessionSettings);
        LogFactory logFactory = new FileLogFactory(sessionSettings);
        MessageFactory messageFactory = new DefaultMessageFactory();
        Application sessionManager = new SessionManager();
        threadedSocketInitiator = new ThreadedSocketInitiator(sessionManager, messageStoreFactory, sessionSettings, logFactory, messageFactory);
...
public static ThreadedSocketInitiator getThreadedSocketInitiator() {
    return threadedSocketInitiator; }

辅助main()类,旨在为JMX-Mbean目的调用:

public class RemoteCommandLine {

private static Logger logger = Logger.getLogger(RemoteCommandLine.class);
private static final String JMX_SERVICE_URL_PREFIX = "service:jmx:rmi:///jndi/rmi://";
private static final String HOST = "localhost";
private static String PORT = "24365";
private static JMXConnectionInstance jmxConnectionInstance;
private static boolean keepAlive = true;

public static void main(String[] args) throws IOException, MalformedObjectNameException, ConfigError {
    logger.debug(GatewayCore.getThreadedSocketInitiator());
...

从命令行开始,我首先运行:

java -classpath etdfix.jar:slf4j-api-1.7.25.jar:mina-core-2.0.16.jar:quickfixj-all-2.0.0.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=24365 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false com.scb.etdfix.GatewayCore sessionSettings.txt

等待inits完成,确保已分配threadedSocketInitiator,然后:

java -classpath etdfix.jar:slf4j-api-1.7.25.jar:mina-core-2.0.16.jar:quickfixj-all-2.0.0.jar com.scb.etdfix.JMX.RemoteCommandLine

最终会为该行抛出空指针异常:

logger.debug(GatewayCore.getThreadedSocketInitiator());

我的计划是让第一个main()初始化对象,然后传递给第二个main(),以便在手动调用时使用相同的对象(它必须是同一个实例)进行进一步的方法调用。这两个类一起编译到同一个JAR中。请告知我如何解决这个问题或我可以做些什么来进一步调试。

事实上,我认为这可能是不可能的,因为当调用第二个main()时,从它的POV第一个main()没有被初始化。因此,我应该通过考虑它们是两个独立的实体来解决这个问题。

1 个答案:

答案 0 :(得分:3)

每个进程(每个java命令)完全分开,无论它们是否运行相同的main()。这是一个功能 - 另一种选择是,只要系统使用公共实用程序,系统的不相关部分就会发生碰撞。

也就是说,如果你想重用它的逻辑,没有什么能阻止你自己调用GatewayCore.main()(用真正的命令行或其他任何参数列表)。但是,将公共代码分解为另一个函数可能是一个好主意:main()有许多特殊职责,程序员通常不希望它在程序中被称为。 / p>