مشكلة مع خدمة انطلاق أوبن أوفيس (soffice) من جافا (القيادة تعمل في سطر الأوامر، ولكن ليس من جاوة)

StackOverflow https://stackoverflow.com/questions/378338

سؤال

وأريد أن exceute أمر بسيط والذي يعمل من قذيفة لكن لا يعمل من جاوة. وهذا هو الأمر أريد أن تنفيذ، والذي يعمل بشكل جيد:

soffice -headless "-accept=socket,host=localhost,port=8100;urp;" 

وهذا هو رمز أنا excecuting من جاوة محاولة تشغيل هذا الأمر:

String[] commands = new String[] {"soffice","-headless","\"-accept=socket,host=localhost,port=8100;urp;\""};
Process process = Runtime.getRuntime().exec(commands)
int code = process.waitFor();
if(code == 0)
    System.out.println("Commands executed successfully");

وعند تشغيل هذا البرنامج أحصل على "تنفيذ أوامر بنجاح". لكن العملية ليست قيد التشغيل عند انتهاء البرنامج. هل من الممكن أن يقتل JVM البرنامج بعد تشغيله؟

لماذا لا هذا العمل؟

هل كانت مفيدة؟

المحلول 2

وأنا أود أن أقول كيف تحل هذه. أنا خلقت النصي ش التي تعمل في الأساس قيادة soffice بالنسبة لي.

وبعد ذلك من جاوة أنا فقط تشغيل البرنامج النصي، وأنه يعمل بشكل جيد، مثل هذا:

public void startSOfficeService() throws InterruptedException, IOException {
        //First we need to check if the soffice process is running
        String commands = "pgrep soffice";
        Process process = Runtime.getRuntime().exec(commands);
        //Need to wait for this command to execute
        int code = process.waitFor();

        //If we get anything back from readLine, then we know the process is running
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        if (in.readLine() == null) {
            //Nothing back, then we should execute the process
            process = Runtime.getRuntime().exec("/etc/init.d/soffice.sh");
            code = process.waitFor();
            log.debug("soffice script started");
        } else {
            log.debug("soffice script is already running");
        }

        in.close();
    }

وأنا أيضا قتل عملية soffice بالدعوة هذا الأسلوب:

public void killSOfficeProcess() throws IOException {
        if (System.getProperty("os.name").matches(("(?i).*Linux.*"))) {
            Runtime.getRuntime().exec("pkill soffice");
        }
    }

لاحظ أن هذا يعمل فقط في لينكس.

نصائح أخرى

ولست متأكدا إذا لم أكن مخطئا، ولكن بقدر ما أرى أنك توليد الأوامر ولكن لم يمر عليها إلى أسلوب "تنفيذ" ... كنت تنفيذ "".

وحاول استخدام Runtime.getRuntime (). إكسيك (أوامر) =)

وأعتقد أنك لا نتعامل مع نقلا عن صحيح. يتضمن سطر الأوامر ش الأصلي علامات الاقتباس المزدوجة لمنع قذيفة تفسير منقوطة. قذيفة شرائط أجبرتها على الفرار قبل ترى عملية soffice لهم.

في جافا البرمجية الخاصة بك وسوف قذيفة لا ترى الحجج، لذلك ليست هناك حاجة لعلامات الاقتباس المزدوجة إضافية (هرب مع الخطوط المائلة العكسية) - وأنها ربما الخلط soffice

وهنا رمز مع علامات الاقتباس إضافية تجريده من (وفاصلة منقوطة القيت في)

String[] commands = new String[] {"soffice","-headless","-accept=socket,host=localhost,port=8100;urp;"};
Process process = Runtime.getRuntime().exec(commands);
int code = process.waitFor();
if(code == 0) 
    System.out.println("Commands executed successfully");

و(تنويه: أنا لا أعرف جافا، وأنا لم تختبر هذا)

و"/Applications/OpenOffice.org\ 2.4.app/Contents/MacOS/soffice.bin -headless -nofirststartwizard -accept='socket,host=localhost,port=8100;urp;StartOffice.Service'"

وأو ببساطة الهروب من الاقتباس ستعمل أيضا. نطعم أمر مثل هذا لبرنامج نصي النمل الذي ينتهي في نهاية المطاف في مكالمة عمال التنفيذ وكأنه لديك أعلاه. وأوصى أيضا إعادة تشغيل عملية كل 500 أو نحو ذلك التحويلات لOOO لا بشكل صحيح تحرير الذاكرة (اعتمادا على الإصدار الذي تقوم بتشغيله).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top