게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
java spring 기반으로 web compiler를 만들고 있습니다.
게시물ID : programmer_21188짧은주소 복사하기
작성자 : 하린
추천 : 0
조회수 : 403회
댓글수 : 0개
등록시간 : 2017/08/07 21:29:56
옵션
  • 본인삭제금지
tryHelloword를 참고한 웹 컴파일러를 만들어보고 있습니다.
동작은 다음과 같습니다.
1. DB에 저장되어 있는 문제를 불러와서 View에 보여줍니다.
2. 이용자가 문제를 풀고 실행을 누르면 controller에서 해당 소스와 클래스이름으로 .java 파일을 만듭니다. (성공)
3. 여기서 컴파일 하여 .class 파일로 만든 뒤 newInstance()로 인스턴스화 시킵니다. (반은 성공...?)

허나, 문제가 .java 파일을 만드는 것이 1개일 경우 정상작동을 하지만
2개일 경우 하나의 파일을 생성 후 컴파일 -> newInstance()를 하는 과정에서 
java.lang.IllegalStateException 에러가 발생합니다.

다만, spring 환경이 아닌 일반 java 환경에서 같은 소스를 돌릴 경우 정상작동을 합니다만...
아무래도 spring의 controller에서 인스턴스화를 2개 이상 진행할 경우에 문제가 발생하는 듯 합니다. 

이런 경우에는 어떤 방법을 사용해야 될까요? 자문을 구해봅니다.


public Object questionBankResult(
String filePath, String currProblemNum,
@RequestParam(value="dataSourceArr[]") String[] dataSourceArr,
@RequestParam(value="dataNameArr[]") String[] dataNameArr) throws Exception{
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();  //classpath 경로 
questFiles += filePath;   //jsp에서 ajax로 전송한 파일 경로
// 디렉토리 생성
File saveFolder = new File(path + questFiles) ;
if(!saveFolder.exists()){
saveFolder.mkdirs();
}

//dataSourceArr : 소스가 들어있는 배열
  //dataNameArr : 소스의 클래스명이 들어있는 배열 

for(int i=0; i<dataNameArr.length; i++){ 
// 내용이 없는 경우에는 파일 생성 및 컴파일을 하지 않는다.
if(dataNameArr[i].length() != 0){
String saveName = dataNameArr[i] + ".java";

//클래스명으로 .java 파일 생성 
File file = new File(saveFolder, saveName);
file.createNewFile();

//.java 파일에 내용 삽입
FileWriter fw = new FileWriter(file);
fw.write(dataSourceArr[i]);
fw.flush();
fw.close();
// 만들어진 Java 파일을 컴파일
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, System.out, System.out, file.getPath());
//인스턴스화 
String classForName = questFiles + dataNameArr[i];
Class cls = Class.forName(classForName.replace("/", "."));
Object obj = cls.newInstance();
}
}
        return null;
};
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호