Java 第二个main()类看不到在第一个main()类中初始化的变量

Java 第二个main()类看不到在第一个main()类中初始化的变量,java,nullpointerexception,static,Java,Nullpointerexception,Static,我正在开发一个需要两个main()类的应用程序,第一个用于实际应用程序,第二个用于JMX连接和管理。我面临的问题是,即使在确保执行第一个main()并初始化变量之后,第二个main()仍在运行,但没有看到这些变量并抛出null异常 应用程序main(): 次要main()类,用于JMX Mbean调用: public class RemoteCommandLine { private static Logger logger = Logger.getLogger(RemoteCommandLi

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

应用程序main():

次要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
等待初始化完成,确保已分配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()时,第一个main()没有从其POV初始化。因此,我应该通过考虑它们是两个独立的实体来处理这个问题。

每个进程(每个
java
命令)都是完全独立的,无论它们是否运行相同的
main()
。这是一个特性,另一种选择是在系统的不相关部分使用公共实用程序时发生冲突

也就是说,如果您想重用其逻辑,没有什么可以阻止您自己调用
GatewayCore.main()
。不过,将公共代码作为另一个函数进行分解可能是个好主意:
main()
有许多特殊的职责,程序员通常不希望在程序中调用它。

每个进程(每个
java
命令)都是完全独立的,无论它们是否运行相同的
main()
。这是一个特性,另一种选择是在系统的不相关部分使用公共实用程序时发生冲突


也就是说,如果您想重用其逻辑,没有什么可以阻止您自己调用
GatewayCore.main()
。不过,将公共代码作为另一个函数进行分解可能是个好主意:
main()
有许多特殊的职责,程序员通常不希望在程序中调用它。

当然不是。第二个主方法不调用初始化方法。您到底期望什么?静态变量不会在JVM之间共享。如果希望两个类都可以访问静态变量,则需要在一个JVM中同时运行这两个类(例如,从第三个类和一个main方法)。第二个主方法不调用初始化方法。您到底期望什么?静态变量不会在JVM之间共享。如果希望两个类都可以访问静态变量,则需要在一个JVM中同时运行这两个类(例如,从第三个类和main方法)。
logger.debug(GatewayCore.getThreadedSocketInitiator());