2009-05-12 3 views
1

독립형 Java 프로그램에서 Java 명령을 호출하려면 어떻게해야합니까?다른 Java 프로그램 호출

저는 Runtime.getRuntime(). exec ("cmd c/javac <> .java")를 이해합니다. 작동 할 것이다. 그러나 이는 플랫폼에 따라 다릅니다.

j2sdk1.4에서 작동하게 할 수있는 다른 API가 있습니까?

+0

당신의 정확한 요구 사항은 무엇입니까? Java 명령어가 의미하는 바는 무엇입니까? – pugmarx

+0

같은 질문입니다. 무엇이 필요합니까? - 다른 JVM에서 코드를 실행하고 싶지만 필요할 때 시작 하시겠습니까? 아니면 '기본'JVM과 동시에 시작할 수 있습니다. - 예를 들어 'javac'을 보여 줬지만 다른 JVM에서 어떤 자바 코드를 실행하고 싶습니까? – pgras

답변

0

JVM을 종료하고 시스템 명령으로 이동하면 플랫폼 관련 명령을 스스로 처리해야합니다. JVM은 추상화를위한 좋은 방법을 제공하므로 멀리 이동해야합니까?

Java 특정 바이너리를 실행하려면 java의 ant 라이브러리를 확인하십시오. 플랫폼에 의존하는 명령을 실행하는 java에서 ant 스크립트를 실행할 수 있습니다.

public class Launcher { 
    ... 
    public static void main(String[] args) throws Exception { 
     launch(Class.forName(args[0]), programArgs(args, 1)); 
    } 

    protected static void launch(Class program, String[] args) throws Exception { 
     Method main = program.getMethod("main", new Class[]{String[].class}); 
     main.invoke(null, new Object[]{args}); 
    } 

    protected static String[] programArgs(String[] sourceArgs, int n) { 
     String[] destArgs = new String[sourceArgs.length - n]; 
     System.arraycopy(sourceArgs, n, destArgs, 0, destArgs.length); 
     return destArgs; 
    } 

을 그리고이 같은 명령 줄을 실행합니다 : 같은 JVM에서 모든 것을 실행할 수있는 경우

3

, 당신이 뭔가를 할 수 있습니다 (

java Launcher OtherClassWithMainMethod %CMD_LINE_ARGS% 
2

Runtime.getRuntime를 호출) .exec()는 플랫폼에 국한되지 않고 매우 비효율적입니다. 새로운 응용 프로그램과 종속성에 따라 잠재적으로 매우 비쌀 수있는 새로운 셸과 전체 jvm을 생성합니다.

"외부"Java 코드를 실행하는 가장 좋은 방법은 CLASSPATH에 배치하는 것입니다. 응용 프로그램의 기본 메서드를 호출해야하는 경우 메서드를 직접 가져 와서 호출하면됩니다. 이것은과 같이 할 수있다 :

물론
import my.externals.SomeMain 

// call as if we are running from console 
SomeMain.main(new String[] {"some", "console", "arguments"}) 

, 최선의 시나리오는 단순히 외부 라이브러리로 사용하고() SomeMain.main를 호출하지 않고도 필요한 코드에 액세스하는 것입니다. 모범 사례를 준수하고 적절한 캡슐화 된 모듈 식 객체를 작성하면 다른 응용 프로그램에서 사용할 때 훨씬 더 큰 이식성과 사용 편의성을 얻을 수 있습니다. GAE에 신 PHP에서

0

자바 프로그래밍 :

import com.newatlanta.commons.vfs.provider.gae.GaeVFS; 
import org.apache.commons.io.IOUtils; 
import java.lang.Long; 
import java.lang.Boolean; 
GaeVFS::setRootPath(quercus_servlet_request()->getSession(true)->getServletContext()->getRealPath('/')); 
define('VFSM', GaeVFS::getManager()); 

//VFSM->resolveFile('gae://gaevfs')->createFolder(); 
$file=VFSM->resolveFile('gae://gaevfs/tmp1'); 
//$file->createFile(); 

$text='pp'; 
$method=$file->getClass()->getDeclaredMethod('updateContentSize', array(Long::TYPE, Boolean::TYPE)); 
$method->setAccessible(true); 
$method->invoke($file, strlen($text), true); 
$out=$file->getContent()->getOutputStream(); 
IOUtils::write($text, $out, 'UTF8'); 
$out->close(); 

$in=$file->getContent()->getInputStream(); 
$method=$file->getClass()->getDeclaredMethod('doGetContentSize',array()); 
$method->setAccessible(true); 
$len=$method->invoke($file); 
$whole=IOUtils::toString($in, 'UTF8').':'.$len."<br>"; 
$in->close(); 
echo $whole; 

GaeVFS::clearFilesCache(); 
GaeVFS::close();