<div>이전글 : </div><a target="_blank" href="http://www.todayhumor.co.kr/board/view.php?table=programmer&no=21188&s_no=13701098&kind=member&page=1&member_kind=total&mn=349143">http://www.todayhumor.co.kr/board/view.php?table=programmer&no=21188&s_no=13701098&kind=member&page=1&member_kind=total&mn=349143</a> <div>-----------------------------------------------------------------------------------------------------------</div> <div><br></div> <div><br></div> <div>파일이 하나일때는 컴파일이 잘 되고 2개 일때는 잘 안되었죠.</div> <div>spring 환경이냐, standard 환경이냐에 따라 안되는건 줄 알았는데</div> <div>단순, classPath를 잘못 설정해줘서 그랬던거네요. </div> <div><br></div> <div>//classPath : 클래스 패스 경로</div> <div>//examFiles : java 파일 저장할 경로 </div> <div><br></div> <div> <div><span style="white-space:pre;"> </span>public Object examSampleCompile(</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><br></div> <div><span style="white-space:pre;"> </span>//examFiles를 전역변수로 만들었기 때문에 examFiles의 경로가 완성되면 filePath의 경로를 더하지 않는다.</div> <div><span style="white-space:pre;"> </span>if(examFiles.indexOf(filePath) < 0){</div> <div><span style="white-space:pre;"> </span>examFiles += filePath; </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[] files = javaCreateFile(dataSourceArr, dataNameArr);</div> <div><br></div> <div><span style="white-space:pre;"> </span>String name = dataNameArr[0];</div> <div><br></div> <div><span style="white-space:pre;"> </span>for(int i=0; i<files.length; i++){</div> <div><span style="white-space:pre;"> </span>compile(files[i].getPath(), classPath, name);</div> <div><span style="white-space:pre;"> </span>}</div> <div><span style="white-space:pre;"> </span>//구글링 했을때 대부분이 newInstance로 인스턴스를 생성하길래 당연히 해줘야 되는 줄 알았는데,</div> <div><span style="white-space:pre;"> </span>//저의 경우, main() 함수만 호출한 결과를 가져오는거라 해당 클래스 찾고 main 함수 찾아서 실행시키만 하면 되었었네요 -,.-;</div> <div><span style="white-space:pre;"> </span>String classForName = examFiles + dataNameArr[0];</div> <div><span style="white-space:pre;"> </span>Class cls = Class.forName(classForName.replace("/", "."));</div> <div><span style="white-space:pre;"> </span>Method m = cls.getMethod("main",String[].class); </div> <div> m.invoke(null, new Object[]{null}); </div> <div> </div> <div> return null;</div> <div><span style="white-space:pre;"> </span>};</div></div> <div>----------------------------------------------------------------------------------------------------------</div> <div> <div><span style="white-space:pre;"> </span>//codemirror에 있는 내용을 .java 파일로 만드는 메서드 입니다.</div> <div><span style="white-space:pre;"> </span>public File[] javaCreateFile(String[] dataSourceArr, String[] dataNameArr) throws Exception{</div> <div><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>File[] files = new File[dataSourceArr.length];</div> <div><br></div> <div><span style="white-space:pre;"> </span>// 디렉토리 생성</div> <div><span style="white-space:pre;"> </span>File saveFolder = new File(classPath + examFiles) ;</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><span style="white-space:pre;"> </span></div> <div><span style="white-space:pre;"> </span>for(int i=0; i<dataNameArr.length; i++){ </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><span style="white-space:pre;"> </span>//파일 생성</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><span style="white-space:pre;"> </span></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>files[i] = file;</div> <div><span style="white-space:pre;"> </span>}</div> <div><span style="white-space:pre;"> </span>}</div> <div><span style="white-space:pre;"> </span>return files;</div> <div><span style="white-space:pre;"> </span>}</div></div> <div>-----------------------------------------------------------------------------------------------------------</div> <div> <div><span style="white-space:pre;"> </span>//java파일을 class 파일로 컴파일 해주는 메서드 입니다.</div> <div> //stackOverFlow에서 참고 하였는데 검색할 때 키워드가 java compiler class... 였나... 검색을 너무 해대서 정확하게 기억이 나질 않는군요.</div> <div> //북마크를 해두었었야 했는데... 무튼 거기서 참고한 소스인데 거기서는 -classpath가 아닌 -d 였나?? 그걸 사용했더라구요.</div> <div> //아마도 cmd에서 java 컴파일 할때 사용하는 명령어같은데 ... </div> <div><span style="white-space:pre;"> </span>public void compile(String sourceFilePath, String classPath, String name) throws Exception {</div> <div><span style="white-space:pre;"> </span>JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();</div> <div><span style="white-space:pre;"> </span>StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);</div> <div><span style="white-space:pre;"> </span>Iterable sourcefiles = fileManager.getJavaFileObjects(sourceFilePath);</div> <div><span style="white-space:pre;"> </span>Iterable<String> options = Arrays.asList("-classpath", classPath);</div> <div><span style="white-space:pre;"> </span>compiler.getTask(null, fileManager, null, options, null, sourcefiles).call();</div> <div><span style="white-space:pre;"> </span>fileManager.close();</div> <div><span style="white-space:pre;"> </span>}</div></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.