Как выполнить файлы JAR из другой папки - PullRequest
0 голосов
/ 03 мая 2019

В настоящее время я создаю NodeJS Webinterface для Minecraft. В настоящее время я борюсь с запуском сервера ... Моя текущая структура папок выглядит следующим образом

./node_modules
./server
./views
app.js
package-lock.json
package.json

Каждый раз, когда я запускаю сервер, который находится в ./servers, файл eula.txt и другие файлы сервера генерируются в домашнем каталоге с моим app.js и так далее. Есть ли способ, как я мог бы изменить каталог, в котором находятся файлы?

Редактировать (краткая версия кода, выполняющего банку):

exec = require('child_process').exec;

exec('java -jar ' + './server/spigot-1.13.2.jar', (err, stdout, stderr) => {
if (err)
    throw err;
console.log(stdout);
console.log(stderr);
});

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Для загрузки банок вы можете использовать следующий класс. Вы просто должны поместить банки в папку и позволить им загружаться из другого плагина.

package de.lukas.kuntze.util.utils;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class JarUtil
{
    public static void loadJars()
    {
        System.out.println("Loading jars...");
        final File jarFolder = new File("plugins" + File.separator + "jars" + File.separator);
        if (!jarFolder.exists())
        {
            jarFolder.mkdir();
        }
        for (final File jar : jarFolder.listFiles())
        {
            try
            {
                final URL url = new URL("jar:" + jar.toURI().toURL().toExternalForm() + "!/");
                final URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
                final Class<URLClassLoader> sysclass = URLClassLoader.class;
                final Method method = sysclass.getDeclaredMethod("addURL", new Class[] { URL.class });
                method.setAccessible(true);
                method.invoke(sysloader, new Object[] { url });
            }
            catch (final Exception e)
            {
                ExceptionUtil.handleException(e);
            }
        }
        System.out.println("Loaded jars.");
    }
}
1 голос
/ 03 мая 2019

Используя spawn вы можете предоставить рабочий каталог.

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

const { spawn } = require('child_process');

const mc = spawn('java', ['-Xmx1024M', '-Xms1024M', '-jar', './server/spigot-1.13.2.jar', 'nogui'], { cwd: './new-server/' });


mc.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

mc.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

mc.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

UPDATE:

Похоже, вы также можете сделать это с exec следующим образом:


exec('java -jar ' + './server/spigot-1.13.2.jar', { cwd: './test-server' }, (err, stdout, stderr) => {
if (err)
    throw err;
console.log(stdout);
console.log(stderr);
});

...