<div>tryHelloword를 참고한 웹 컴파일러를 만들어보고 있습니다.</div> <div>동작은 다음과 같습니다.</div>1. DB에 저장되어 있는 문제를 불러와서 View에 보여줍니다. <div>2. 이용자가 문제를 풀고 실행을 누르면 controller에서 해당 소스와 클래스이름으로 .java 파일을 만듭니다. (성공)</div> <div>3. 여기서 컴파일 하여 .class 파일로 만든 뒤 newInstance()로 인스턴스화 시킵니다. (반은 성공...?)</div> <div><br></div> <div>허나, 문제가 .java 파일을 만드는 것이 1개일 경우 정상작동을 하지만</div> <div>2개일 경우 하나의 파일을 생성 후 컴파일 -> newInstance()를 하는 과정에서 </div> <div>java.lang.IllegalStateException 에러가 발생합니다.</div> <div><br></div> <div>다만, spring 환경이 아닌 일반 java 환경에서 같은 소스를 돌릴 경우 정상작동을 합니다만...</div> <div>아무래도 spring의 controller에서 인스턴스화를 2개 이상 진행할 경우에 문제가 발생하는 듯 합니다. </div> <div><br></div> <div>이런 경우에는 어떤 방법을 사용해야 될까요? 자문을 구해봅니다.</div> <div><br></div> <div><br></div> <div> <div>public Object questionBankResult(</div> <div><span style="white-space:pre;"> </span>String filePath, String currProblemNum,</div> <div><span style="white-space:pre;"> </span>@RequestParam(value="dataSourceArr[]") String[] dataSourceArr,</div> <div><span style="white-space:pre;"> </span>@RequestParam(value="dataNameArr[]") String[] dataNameArr) throws Exception{</div> <div><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); //classpath 경로 </div> <div><span style="white-space:pre;"> </span>questFiles += filePath; //jsp에서 ajax로 전송한 파일 경로</div> <div><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>// 디렉토리 생성</div> <div><span style="white-space:pre;"> </span>File saveFolder = new File(path + questFiles) ;</div> <div><span style="white-space:pre;"> </span>if(!saveFolder.exists()){</div> <div><span style="white-space:pre;"> </span>saveFolder.mkdirs();</div> <div><span style="white-space:pre;"> </span>}</div> <div><br></div> <div><span style="white-space:pre;"> </span>//<span style="font-size:9pt;">dataSourceArr : 소스가 들어있는 배열</span></div> <div><span style="font-size:9pt;"> <span style="white-space:pre;"> </span>//</span><span style="font-size:9pt;">dataNameArr : 소스의 클래스명이 들어있는 배열 </span></div> <div><span style="font-size:9pt;"><br></span></div> <div><span style="white-space:pre;"> </span>for(int i=0; i<dataNameArr.length; i++){ </div> <div><span style="font-size:9pt;white-space:pre;"> </span>// 내용이 없는 경우에는 파일 생성 및 컴파일을 하지 않는다.<span style="font-size:9pt;white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>if(dataNameArr[i].length() != 0){</div> <div><span style="white-space:pre;"> </span>String saveName = dataNameArr[i] + ".java";</div> <div><br></div> <div><span style="white-space:pre;"> </span>//클래스명으로 .java 파일 생성 </div> <div><span style="white-space:pre;"> </span>File file = new File(saveFolder, saveName);</div> <div><span style="white-space:pre;"> </span>file.createNewFile();</div> <div><br></div> <div><span style="white-space:pre;"> </span>//.java 파일에 내용 삽입</div> <div><span style="white-space:pre;"> </span>FileWriter fw = new FileWriter(file);</div> <div><span style="white-space:pre;"> </span>fw.write(dataSourceArr[i]);</div> <div><span style="white-space:pre;"> </span>fw.flush();</div> <div><span style="white-space:pre;"> </span>fw.close();</div> <div><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>// 만들어진 Java 파일을 컴파일</div> <div><span style="white-space:pre;"> </span>JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();</div> <div><span style="white-space:pre;"> </span>compiler.run(null, System.out, System.out, file.getPath());<span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>//인스턴스화 </div> <div><span style="white-space:pre;"> </span>String classForName = questFiles + dataNameArr[i];</div> <div><span style="white-space:pre;"> </span>Class cls = Class.forName(classForName.replace("/", "."));</div> <div><span style="white-space:pre;"> </span>Object obj = cls.newInstance();</div> <div><span style="white-space:pre;"> </span>}</div> <div><span style="white-space:pre;"> </span>}</div> <div> return null;</div> <div><span style="white-space:pre;"> </span>};</div></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.