2011-05-05 5 views
2

우리는 빌드 파일을 개미에서 메이븐 플러그인으로 변환하고 있습니다. 우리는 maven plugin에서 데이터베이스 (hsqldb)를 시작/중지하려고합니다.메이븐 플러그인에서 포크와 스폰 설정하기

데이터베이스를 시작하는 데 성공했습니다. 그러나 플러그인이 실행될 때 플러그인이 데이터베이스를 중지한다고 생각합니다. 데이터베이스는 실행 후 계속 실행되어야하지만 즉시 중단됩니다.

우리는 'fork'와 'spawn'속성 (우리는 개미의 build.xml에도 있음)을 사용해야한다고 생각하지만 자바 클래스에서 이들을 구현하는 방법을 모르고 있습니다. 우리의 DatabaseController (AbstractMojo에서 확장).

아이디어가 있으십니까? 우리가 플러그인을 실행하면

hsqlServer = new Server(); 

hsqlServer.setLogWriter(null); 
hsqlServer.setSilent(true); 

hsqlServer.setDatabaseName(0, "database"); 
hsqlServer.setDatabasePath(0, "file:data/database"); 

getLog().info("Starting server!"); 
hsqlServer.start(); 

이 데이터베이스는 우리가 심지어 테이블을 생성하고 데이터를 기록 관리, 시작 : 우리는 HSQLDB를 사용하고

, 우리는 초기화하는 방법 코드를 야그. 그런 다음 플러그인이 중지되고 서버가 자동으로 중지합니다. 당신이 할 수있는

+0

글쎄,'hsqlServer.stop()'에서 NullPointerException이 발생하면'hsqlServer'는 null이어야합니다. 맞습니까? 아니면'hsqlServer.stop()'_throws_ NullPointerException을 의미합니까? 이 경우 스택 추적을 제공하십시오. –

+0

nullPointerException이 수정되어 이제 cmd에서 데이터베이스를 실행할 수 있습니다. 문제는 플러그인을 실행할 때 플러그인이 중지 될 때 데이터베이스가 여전히 종료된다는 것입니다. 우리는 데이터베이스를 유지하기 위해 일종의 루프를 만들었고 완전히 작동합니다. 이제 유일한 문제는 프로그램이 루프에서 '갇혀 있기'때문에 cmd에서 더 이상 아무것도 할 수 없으며이를 피하기 위해서입니다. 어쩌면이 문제를 해결할 수있는 다른 방법이있을 수 있지만 포크 및/또는 스폰 이외의 다른 것을 생각할 수는 없습니다. – Walle

답변

0

한 가지입니다

제론,

hsqlServer.stop(); 

종류에 관해서 : 우리는 다른 플러그인을 실행하면

, 하나는 우리가 항상이 라인에서 NullPointerException이 얻을 서버를 중지 새로운 Java 프로세스를 포킹하는 기존의 Maven 플러그인을 살펴 보았다. Maven-surefire-plugins for one, 비슷한 것을하십시오. Surefire는 포크를 제어하는 ​​forkMode이라는 구성 (pom.xml에 지정됨)을 가지고 있습니다. 플러그인을 확인하기 위해 (코드를 svn 체크 아웃)해야 할 수도 있습니다. 나는 많이 확신하지 못한다. 그러나 처음에는 다음과 같은 클래스 (#fork(Object testSet, Properties...)를 읽을 수 있습니다!

./maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java 
0

maven에서 실행되는 코드는 다른 프로세스에서 fork됩니다. 일부 프로젝트 영역에서 프로세스 작업을했는데, 그것에 대한 명확한 문서가 없습니다. 당신은 같은 코드 뭔가 호출 할 수 데몬 스레드로

Thread.currentThread().setDaemon(true); 
hsqlServer = new Server(); 

hsqlServer.setLogWriter(null); 
hsqlServer.setSilent(true); 

hsqlServer.setDatabaseName(0, "database"); 
hsqlServer.setDatabasePath(0, "file:data/database"); 

getLog().info("Starting server!"); 
hsqlServer.start(); 

을 받는다는 할 수 것은 마녀 코드는 백그라운드에서 runned해야한다. 그것은 가정이지만, 시도해 볼 수 있습니다.