admin 管理员组文章数量: 887021
2023年12月21日发(作者:3d studio max下载)
java动态编译整个项目,解决jar包找不到问题
原文://javac/
动态将java文件编译为class文件解决方案:
将tempsdlsrc目录中的java源文件编译成class文件,并存放到tempsdlclasses目录中
java中早就提供了用java方式去动态编译java源文件的接口,有关java动态编译的API都在包中。使用jdk1.6以上版本提供的JavaCompiler工具来动态编译java源文件。
我们可以通过ToolProvider类的静态方法getSystemJavaCompiler得到JavaCompiler对象实例。
1.
2.
得到JavaCompiler对象实例后,我们可以调用该工具的getTask(Writer out, JavaFileManager
fileManager, DiagnosticListener super JavaFileObject> diagnosticListener,
Iterable
compilationUnits) 方法获取一个编译任务对象。
3. CompilationTask compilationTask = k(null, fileManager, diagnostics,
options, null, compilationUnits);
该方法的第一个参数为文件输出,这里我们可以不指定,我们采用javac命令的-d参数来指定class文件的生成目录。
第二个参数为文件管理器实例
4.
5.
// 获取标准文件管理器实例
StandardJavaFileManager fileManager = ndardFileManager(null,
null, null);
该文件管理器实例的作用就是将我们需要动态编译的java源文件转换为getTask需要的编译单元。
// 获取编译器实例
JavaCompiler compiler = temJavaCompiler();
6.
7.
// 获取要编译的编译单元
Iterable extends JavaFileObject> compilationUnits =
aFileObjectsFromFiles(sourceFileList);
第三个参数DiagnosticCollector
第四个参数为编译命令选项,就是javac命令的可选项,这里我们主要使用了-d和-sourcepath这两个选项。
8.
9.
/**
* 编译选项,在编译java文件时,编译程序会自动的去寻找java文件引用的其他的java源文件或者class。 -sourcepath选项就是定义java源文件的查找目录, -classpath选项就是定义class文件的查找目录,-d就是编译文件的输出目录。
10.
11.
*/
Iterable
=("-encoding",encoding,"-classpath",jars,"-d", targetDir, "-sourcepath",
sourceDir);
12.
第五个参数为类名称
第六个参数为上面提到的编译单元,就是我们需要编译的java源文件
当我们得到CompilationTask compilationTask编译任务后,我们就可以调用()方法进行编译工作
13.
14.
1.
2.
package ;
// 运行编译任务
()
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
import ;
import lter;
import ption;
import ist;
import ;
import ;
import stic;
import sticCollector;
import mpiler;
import leObject;
import rdJavaFileManager;
import ovider;
import ationTask;
public class DynamicCompilerUtil {
private String jars="";
private String targetDir="";
/** 判断字符串是否为空 有值为true 空为:false */
public boolean isnull(String str) {
if (null == str)
{return false;}
else if ("".equals(str))
{return false;}
else if (("null"))
{return false;}
else
{return true;}
}
/**
* 编译java文件
* @param encoding 编译编码
* @param jars 需要加载的jar
* @param filePath 文件或者目录(若为目录,自动递归编译)
* @param sourceDir java源文件存放目录
* @param targetDir 编译后class类文件存放目录
* @param diagnostics 存放编译过程中的错误信息
* @return
* @throws Exception
*/
public boolean compiler(String encoding,String jars,String filePath, String sourceDir, String targetDir, DiagnosticCollector
throws Exception {
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
// 获取编译器实例
JavaCompiler compiler = temJavaCompiler();
// 获取标准文件管理器实例
StandardJavaFileManager fileManager = ndardFileManager(null, null, null);
try {
if (!isnull(filePath) && !isnull(sourceDir) && !isnull(targetDir)) {
return false;
}
// 得到filePath目录下的所有java源文件
File sourceFile = new File(filePath);
List
Dir=targetDir;
getSourceFiles(sourceFile,sourceFileList);
// 没有java文件,直接返回
if (() == 0) {
n(filePath + "目录下查找不到任何java文件");
return false;
}
// 获取要编译的编译单元
Iterable extends JavaFileObject> compilationUnits = aFileObjectsFromFiles(sourceFileList);
/**
* 编译选项,在编译java文件时,编译程序会自动的去寻找java文件引用的其他的java源文件或者class。 -sourcepath选项就是定义java源文件的查找目录, -classpath选项就是定义class文件的查找目录。
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
*/
Iterable
CompilationTask compilationTask = k(null, fileManager, diagnostics, options, null, compilationUnits);
// 运行编译任务
return ();
} finally {
();
}
}
/**
* 查找该目录下的所有的java文件
* @param sourceFile
* @param sourceFileList
* @throws Exception
*/
84.
85.
86.
87.
88.
89.
90.
91.
92.
private void getSourceFiles(File sourceFile, List
Exception {
if (() && sourceFileList != null) {//文件或者目录必须存在
if (ctory()) {// 若file对象为目录
// 得到该目录下以.java结尾的文件或者目录
File[] childrenFiles = les(new FileFilter() {
public boolean accept(File pathname) {
if (ctory()) {
try {
new CopyDirectory().copyDirectiory(h(),targetDir+h().substring(h().indexOf("src")+3,h().length()));
93.
94.
95.
96.
97.
98.
99.
} catch (IOException e) {
// TODO Auto-generated catch block
tackTrace();
}
return true;
} else {
String name = e();
100. if(th(".java") ? true : false){
101. return true;
102. }
103. try {
104. new CopyDirectory().copyFile(pathname,new File(targetDir+h().substring(h().indexOf("src")+3,h().length())));
105. } catch (IOException e) {
106. // TODO Auto-generated catch block
107. tackTrace();
108. }
109. return false;
110. }
111. }
112. });
113. // 递归调用
114. for (File childFile : childrenFiles) {
115. getSourceFiles(childFile, sourceFileList);
116. }
117. } else {// 若file对象为文件
118. (sourceFile);
119. }
120. }
121. }
122. /**
123. * 查找该目录下的所有的jar文件
124. * @param sourceFile
125. * @param sourceFileList
126. * @throws Exception
127. */
128. private String getJarFiles(String jarPath) throws Exception {
129. File sourceFile = new File(jarPath);
130. // String jars="";
131. if (()) {// 文件或者目录必须存在
132. if (ctory()) {// 若file对象为目录
133. // 得到该目录下以.java结尾的文件或者目录
134. File[] childrenFiles = les(new FileFilter() {
135. public boolean accept(File pathname) {
136. if (ctory()) {
137. return true;
138. } else {
139. String name = e();
140. if(th(".jar") ? true : false){
141. jars=jars+h()+";";
142. return true;
143. }
144. return false;
145. }
146. }
147. });
148. }
149. }
150. return jars;
151. }
152. public static void main(String[] args) {
153. try {
154. // 编译F:亚信工作SDL文件sdlsrc目录下的所有java文件
155. String filePath = "E:workspaceCOD-MSsrc";
156. String sourceDir = "E:workspaceCOD-MSsrc";
157. String jarPath = "E:workspaceCOD-MSWebRootWEB-INFlib";
158. String targetDir = "E:javaprojectbin";
159. DiagnosticCollector
160. DynamicCompilerUtil dynamicCompilerUtil=new DynamicCompilerUtil();
161. boolean compilerResult = er("UTF-8",Files(jarPath),filePath, sourceDir, targetDir, diagnostics);
162. if (compilerResult) {
163. n("编译成功");
164. } else {
165. n("编译失败");
166. for (Diagnostic diagnostic : gnostics()) {
167. // ("%s[line %d column %d]-->%s%n", d(), eNumber(),
168. // umnNumber(),
169. // sage(null));
170. n(sage(null));
171. }
172. }
173. } catch (Exception e) {
174. tackTrace();
175. }
176. }
177.
178.
179.
180. }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
package ;
import .*;
/**
* 复制文件夹或文件夹
*/
public class CopyDirectory {
// 源文件夹
String url1 = "E:workspaceDeployeTest";
// 目标文件夹
String url2 = "E:javaprojectbin";
public static void main(String args[]) throws IOException {
CopyDirectory copyDirectory=new CopyDirectory();
// 创建目标文件夹
(new File(2)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(1)).listFiles();
for (int i = 0; i < ; i++) {
if (file[i].isFile()) {
// 复制文件
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
le(file[i], new File(2 + file[i].getName()));
}
if (file[i].isDirectory()) {
// 复制目录
String sourceDir = 1 + tor + file[i].getName();
String targetDir = 2 + tor + file[i].getName();
rectiory(sourceDir, targetDir);
}
}
}
/***
* 复制文件
* @param sourceFile 源文件
* @param targetFile 目标文件
* @throws IOException
*/
public void copyFile(File sourceFile, File targetFile)
throws IOException {
// 新建文件输入流并对它进行缓冲
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff = new BufferedInputStream(input);
// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff = new BufferedOutputStream(output);
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len = (b)) != -1) {
(b, 0, len);
}
// 刷新此缓冲的输出流
();
// 关闭流
();
();
();
();
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
}
/***
* 复制文件夹
* @param sourceDir 源文件夹路径
* @param targetDir 目标文件夹路径
* @throws IOException
*/
public void copyDirectiory(String sourceDir, String targetDir)
throws IOException {
// 新建目标目录
(new File(targetDir)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(sourceDir)).listFiles();
for (int i = 0; i < ; i++) {
if (file[i].isFile()) {
// 源文件
File sourceFile = file[i];
// 目标文件
File targetFile = new File(new File(targetDir)
.getAbsolutePath()
+ tor + file[i].getName());
copyFile(sourceFile, targetFile);
}
if (file[i].isDirectory()) {
// 准备复制的源文件夹
String dir1 = sourceDir + "/" + file[i].getName();
// 准备复制的目标文件夹
String dir2 = targetDir + "/" + file[i].getName();
copyDirectiory(dir1, dir2);
}
}
}
}
版权声明:本文标题:java动态编译整个项目,解决jar包找不到问题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703163085h440524.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论