Skip to content

Commit 1e98f58

Browse files
author
“threedr3am”
committed
feat:java-compile
1 parent dc8a8dc commit 1e98f58

File tree

8 files changed

+425
-0
lines changed

8 files changed

+425
-0
lines changed

java-compile/pom.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>learn-java-bug</artifactId>
7+
<groupId>com.xyh</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>java-compile</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>org.javassist</groupId>
17+
<artifactId>javassist</artifactId>
18+
<version>3.25.0-GA</version>
19+
<scope>compile</scope>
20+
</dependency>
21+
</dependencies>
22+
23+
</project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import javax.tools.JavaCompiler;
4+
import javax.tools.ToolProvider;
5+
6+
/**
7+
* @author threedr3am
8+
*/
9+
public class ByJavaCompiler {
10+
11+
//直接使用JavaCompiler指定java文件编译
12+
public static void c() {
13+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
14+
int compilationResult = javaCompiler.run(null, null, null, "-cp", "/tmp/ccc/CCC.jar", "/tmp/Main.java");
15+
// 返回0表示编译成功
16+
if (compilationResult == 0) {
17+
System.out.println("success");
18+
} else {
19+
System.out.println("fail");
20+
}
21+
}
22+
23+
public static void main(String[] args) {
24+
c();
25+
}
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.nio.charset.Charset;
4+
import java.util.List;
5+
import java.util.Locale;
6+
import javax.tools.Diagnostic;
7+
import javax.tools.DiagnosticCollector;
8+
import javax.tools.JavaCompiler;
9+
import javax.tools.JavaCompiler.CompilationTask;
10+
import javax.tools.JavaFileObject;
11+
import javax.tools.StandardJavaFileManager;
12+
import javax.tools.ToolProvider;
13+
14+
/**
15+
* @author threedr3am
16+
*/
17+
public class ByJavaFileObject {
18+
19+
//使用了JavaFileObject指定java文件进行编译
20+
public static void d() {
21+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
22+
ClassLoader classLoader = ByJavaFileObject.class.getClassLoader();
23+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
24+
StandardJavaFileManager standardJavaFileManager = javaCompiler
25+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
26+
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
27+
Iterable<? extends JavaFileObject> javaFileObjects = standardJavaFileManager.getJavaFileObjects("/tmp/ccc/CCC.java", "/tmp/Main.java");
28+
29+
// 编译任务
30+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
31+
Boolean result = task.call();
32+
System.out.println(result);
33+
List list = diagnostics.getDiagnostics();
34+
for (Object object : list) {
35+
Diagnostic d = (Diagnostic) object;
36+
System.out.println(d.getMessage(Locale.ENGLISH));
37+
}
38+
}
39+
40+
public static void main(String[] args) {
41+
d();
42+
}
43+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.io.IOException;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
6+
import java.nio.charset.Charset;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.Locale;
10+
import javax.tools.Diagnostic;
11+
import javax.tools.DiagnosticCollector;
12+
import javax.tools.JavaCompiler;
13+
import javax.tools.JavaCompiler.CompilationTask;
14+
import javax.tools.JavaFileObject;
15+
import javax.tools.SimpleJavaFileObject;
16+
import javax.tools.StandardJavaFileManager;
17+
import javax.tools.ToolProvider;
18+
19+
/**
20+
* @author threedr3am
21+
*/
22+
public class CustomJavaFileObject {
23+
24+
//使用了自定义JavaFileObject实现的动态编译
25+
public static void e() throws URISyntaxException {
26+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
27+
ClassLoader classLoader = CustomJavaFileObject.class.getClassLoader();
28+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
29+
StandardJavaFileManager standardJavaFileManager = javaCompiler
30+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
31+
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
32+
StringBuilder stringBuilder = new StringBuilder()
33+
.append("class Main {")
34+
.append(" public static void main(String[] args) {")
35+
.append(" System.out.println(\"hello FFF!\");")
36+
.append(" }")
37+
.append("}");
38+
Iterable<? extends JavaFileObject> javaFileObjects = Arrays
39+
.asList(new JavaObjectFromString("Main", stringBuilder.toString()));
40+
41+
// 编译任务
42+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
43+
Boolean result = task.call();
44+
System.out.println(result);
45+
List list = diagnostics.getDiagnostics();
46+
for (Object object : list) {
47+
Diagnostic d = (Diagnostic) object;
48+
System.out.println(d.getMessage(Locale.ENGLISH));
49+
}
50+
}
51+
52+
public static void main(String[] args) throws URISyntaxException {
53+
e();
54+
}
55+
56+
static class JavaObjectFromString extends SimpleJavaFileObject {
57+
58+
private String content;
59+
60+
public JavaObjectFromString(String className, String content) throws URISyntaxException {
61+
super(new URI(className), Kind.SOURCE);
62+
this.content = content;
63+
}
64+
65+
@Override
66+
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
67+
return content;
68+
}
69+
}
70+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.io.IOException;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
6+
import java.nio.charset.Charset;
7+
import java.util.Arrays;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Locale;
11+
import java.util.Map;
12+
import javax.tools.Diagnostic;
13+
import javax.tools.DiagnosticCollector;
14+
import javax.tools.FileObject;
15+
import javax.tools.ForwardingJavaFileManager;
16+
import javax.tools.JavaCompiler;
17+
import javax.tools.JavaCompiler.CompilationTask;
18+
import javax.tools.JavaFileManager;
19+
import javax.tools.JavaFileObject;
20+
import javax.tools.SimpleJavaFileObject;
21+
import javax.tools.StandardJavaFileManager;
22+
import javax.tools.StandardLocation;
23+
import javax.tools.ToolProvider;
24+
25+
/**
26+
* @author threedr3am
27+
*/
28+
public class CustomJavaFileObjectAndFileManeger {
29+
30+
//使用了自定义JavaFileObject实现的动态编译
31+
public static void e() throws URISyntaxException {
32+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
33+
ClassLoader classLoader = CustomJavaFileObjectAndFileManeger.class.getClassLoader();
34+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
35+
StandardJavaFileManager standardJavaFileManager = javaCompiler
36+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
37+
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
38+
StringBuilder stringBuilder = new StringBuilder()
39+
.append("class Main {")
40+
.append(" public static void main(String[] args) {")
41+
.append(" System.out.println(\"hello FFF!\");")
42+
.append(" }")
43+
.append("}");
44+
Iterable<? extends JavaFileObject> javaFileObjects = Arrays
45+
.asList(new JavaObjectFromString("Main", stringBuilder.toString()));
46+
47+
// 编译任务
48+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
49+
Boolean result = task.call();
50+
System.out.println(result);
51+
List list = diagnostics.getDiagnostics();
52+
for (Object object : list) {
53+
Diagnostic d = (Diagnostic) object;
54+
System.out.println(d.getMessage(Locale.ENGLISH));
55+
}
56+
}
57+
58+
public static void main(String[] args) throws URISyntaxException {
59+
e();
60+
}
61+
62+
static class JavaObjectFromString extends SimpleJavaFileObject {
63+
64+
private String content;
65+
66+
public JavaObjectFromString(String className, String content) throws URISyntaxException {
67+
super(new URI(className), Kind.SOURCE);
68+
this.content = content;
69+
}
70+
71+
@Override
72+
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
73+
return content;
74+
}
75+
}
76+
77+
static class FileManagerImpl extends ForwardingJavaFileManager<JavaFileManager> {
78+
79+
private final Map<URI, JavaFileObject> fileObjects
80+
= new HashMap<URI, JavaFileObject>();
81+
82+
public FileManagerImpl(JavaFileManager fileManager) {
83+
super(fileManager);
84+
}
85+
86+
@Override
87+
public FileObject getFileForInput(Location location, String packageName,
88+
String relativeName) throws IOException {
89+
FileObject o = fileObjects.get(uri(location, packageName, relativeName));
90+
if (o != null) {
91+
return o;
92+
}
93+
return super.getFileForInput(location, packageName, relativeName);
94+
}
95+
96+
public void putFileForInput(StandardLocation location, String packageName,
97+
String relativeName, JavaFileObject file) {
98+
fileObjects.put(uri(location, packageName, relativeName), file);
99+
}
100+
101+
private URI uri(Location location, String packageName, String relativeName) {
102+
103+
return null;
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)