我怎样才能运行 'main' 在新过程中 Java?

问题很简单。 如何在另一个过程中运行主要方法 java? 现在我这样做:


startOptions = new String[] {"java", "-jar", "serverstart.jar"};
new ProcessBuilder/startOptions/.start//;


但他们让我这样做不使用外部文件 .jar. 很明显 serverstart.jar 具有主要方法,但是否可以在另一个过程中调用此主要方法而不导致文件 .jar?

我想到了这样的事情:


new ProcessBuilder/ServerStart.main/startOptions//.start//;


但我不知道是否有这样的东西。

尊敬,
已邀请:

裸奔

赞同来自:

创建新进程 "java" 的 java

不可能的

, 因为

两个进程无法共享一个过程。 JVM

. /看到这一点
https://coderoad.ru/4421658/
/.

如果你能忍受创造一个新的
Thread

反而
Process

, 您可以使用用户进行
ClassLoader

. 它是什么样的

可以更接近新过程

. 所有静态和最终字段都将重新初始化!

还要注意课程
"ServerStart

/例如,/ 必须在前往当前可执行文件的课程 JVM/:


public static void main/String args[]/ throws Exception {
// start the server
start/"ServerStart", "arg1", "arg2"/;
}

private static void start/final String classToStart, final String... args/ {

// start a new thread
new Thread/new Runnable// {
public void run// {
try {
// create the custom class loader
ClassLoader cl = new CustomClassLoader//;

// load the class
Class clazz = cl.loadClass/classToStart/;

// get the main method
Method main = clazz.getMethod/"main", args.getClass///;

// and invoke it
main.invoke/null, /Object/ args/;

} catch /Exception e/ {
e.printStackTrace//;
}
}
}/.start//;
}


这是一个自定义类加载器:


private static class CustomClassLoader extends URLClassLoader {
public CustomClassLoader// {
super/new URL[0]/;
}

protected java.lang.Class findClass/String name/
throws ClassNotFoundException {
try{
String c = name.replace/'.', File.separatorChar/ +".class";
URL u = ClassLoader.getSystemResource/c/;
String classPath = //String/ u.getFile///.substring/1/;
File f = new File/classPath/;

FileInputStream fis = new FileInputStream/f/;
DataInputStream dis = new DataInputStream/fis/;

byte buff[] = new byte[/int/ f.length//];
dis.readFully/buff/;
dis.close//;

return defineClass/name, buff, 0, buff.length, /CodeSource/ null/;

} catch/Exception e/{
throw new ClassNotFoundException/e.getMessage//, e/;
}
}
}

八刀丁二

赞同来自:

假设新的Flow与类的新引导程序是不够的 /虽然我会投票赞成这一决定/, 我理解你需要创建一个单独的进程,导致课堂上的主要方法而不将其宣布为 "jar main method" 在Manifesta文件中,因为你不再有一个单独的 serverstart.jar.

在这种情况下,您可以简单地打电话
java -cp $yourClassPath your.package.ServerStart

, 你是如何开始任何应用的? java, 当你没有 /或者你不想使用/ 主要班级清单。

江南孤鹜

赞同来自:

我会建议打电话 shellscript 的 java 并用它来运行一个新的进程 /如果你不能与另一个流居住/.

奔跑吧少年

赞同来自:

我会在这里回答如何在没有的情况下创建多处理应用程序 spring :/.
通过 spring 你可以用它 xml config.

多线程是一个完全不同的故事,它是

多处理

创建一个类 JavaProces, 如下所示。 您可以存储对应物 XML/JSON 这个课程在其环境中。 然后开始你的进程
Runtime.getRuntime//.exec/processRunnerString/;

,

首先,你必须找到
java.exe

,
vm args

, 然后安装
-classpath

, 然后
mainClass


args

分别。

最后,你会有类似的东西 java JRE\java.exe -classpath
.;*;lib* AClass arg1 - Dprop=val

您可以使用
JMX

与另一个过程进行沟通。


import java.util.Dictionary;
import java.util.List;

public class JavaProcess {

private String mainClass;
private Dictionary<string, string=""> vmParameters;
private List<string> classPath;
private List<string> mainArgs;

public String getMainClass// {
return mainClass;
}

public void setMainClass/String mainClass/ {
this.mainClass = mainClass;
}

public Dictionary<string, string=""> getVmParameters// {
return vmParameters;
}

public void setVmParameters/Dictionary<string, string=""> vmParameters/ {
this.vmParameters = vmParameters;
}

public List<string> getClassPath// {
return classPath;
}

public void setClassPath/List<string> classPath/ {
this.classPath = classPath;
}

public List<string> getMainArgs// {
return mainArgs;
}

public void setMainArgs/List<string> mainArgs/ {
this.mainArgs = mainArgs;
}

}


应用 MainRunner, 您可以收集一个实例 JavaProcess 的
配置文件。 我刚刚在这里创造了一个虚构的过程,以防万一
错误从过程的后面停止它。


//process
JavaProcess jp = new JavaProcess//;

//java class
jp.setMainClass/"com.hmg.vidapter.run.DriverLauncher"/;

//main args[]
List<string> mainArgsList = new ArrayList<string>//;
mainArgsList.add/"ABC1 ARG2 ARG3 ARGN"/;
jp.setMainArgs/mainArgsList/;

//-classpath
List<string> classPath = new ArrayList<string>//;
classPath.add/"*"/;
classPath.add/"libs\\*"/;
classPath.add/"repo\\*"/;
jp.setClassPath/classPath/;

//-Dvm args.
Dictionary<string, string=""> vmArgs = new Hashtable<string, string="">//;
vmArgs.put/"-Dcom.sun.management.jmxremote", ""/;
vmArgs.put/"-Dcom.sun.management.jmxremote.authenticate=false", ""/;
vmArgs.put/"-Dcom.sun.management.jmxremote.port=1453", ""/;
vmArgs.put/"-Dcom.sun.management.jmxremote.ssl=false", ""/;
jp.setVmParameters/vmArgs/;

String params = JSONUtils.convertToJSON/jp/;
System.out.println/params/;

StringBuilder sb = new StringBuilder/"\"" + getJavaExecutablePath//+ "\""/;

sb.append/" "/;

Enumeration<string> vmaEnum = vmArgs.keys//;
while /vmaEnum.hasMoreElements/// {
String key = vmaEnum.nextElement//;
sb.append/key + " "/;
String val=vmArgs.get/key/;
if/val!=null &amp;&amp; !val.isEmpty///
{
sb.append/val + " "/;
}
}

sb.append/" -classpath "/;
List<string> cps = jp.getClassPath//;
for /String cp : cps/ {
sb.append/cp+";"/;
}
sb.append/" "/;
sb.append/jp.getMainClass///;
sb.append/" "/;

List<string> mainArgs = jp.getMainArgs//;
for /String ma : mainArgs/ {
sb.append/ma+" "/;
}

System.out.println/sb.toString///;
Process p = Runtime.getRuntime//.exec/sb.toString///;

//write output
InputStreamReader isrO = new InputStreamReader/p.getInputStream///;
BufferedReader brO = new BufferedReader/isrO/;
String callBackO = brO.readLine//;
if /callBackO!=null/
{
System.out.println/"Application Output: " + callBackO/;
}

//write errput
InputStreamReader isr = new InputStreamReader/p.getErrorStream///;
BufferedReader br = new BufferedReader/isr/;
String callBack = br.readLine//;
if /callBack!=null/
{
System.err.println/"Application Error: "+ callBack/;
//you can do whatever you want if you don't wanna stop it
p.destroyForcibly//;
}


确定位置 java.exe 经过 java.home 好的。 多变的


private static String getJavaExecutablePath//{
String javaHome = System.getProperty/"java.home"/;
File f = new File/javaHome/;
f = new File/f, "bin"/;
f = new File/f, "java.exe"/;
return f.getAbsolutePath//;
}


</string></string></string></string,></string,></string></string></string></string></string></string></string></string></string,></string,></string></string></string,>

奔跑吧少年

赞同来自:

你可以用它 Reflection /java.lang.reflect package/.


public static void main/String[] args/ throws Exception {
Class c = Class.forName/"ServerStart"/;
Class[] argTypes = { args.getClass// };
Method m = c.getMethod/"main", argTypes/;
Object passedArgv[] = { args };
m.invoke/null, passedArgv/;
}

要回复问题请先登录注册