Commit 9de53f57 authored by Emmanuel Bourg's avatar Emmanuel Bourg

Imported Upstream version 2.2.4

parent bd1ff451
......@@ -5,6 +5,19 @@
*.war
*.ear
# IntelliJ
*.iml
*.ipr
*.iws
.idea
compiler/target
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# Eclipse
.classpath
.project
.settings/
# maven
target
This diff is collapsed.
......@@ -11,23 +11,41 @@ You can include in your project with
<dependency>
<groupId>net.openhft</groupId>
<artifactId>compiler</artifactId>
<version>2.1.2</version>
<version>2.2.1</version>
</dependency>
You can find the latest version here [maven search for net.openhft:compiler](http://search.maven.org/#browse%7C842970587)
## Simple example
You needa CachedCompiler and access to you JDK's tools.jar.
You need a CachedCompiler and access to your JDK's tools.jar.
private final CachedCompiler cc = new CachedCompiler(null, null);
// dynamically you can call
Class aClass = cc.loadFromJava(className, javaCode);
KnownInterface o = (KnownInterface) aClass.newInstance();
String className = "mypackage.MyClass";
String javaCode = "package mypackage;\n" +
"public class MyClass implements Runnable {\n" +
" public void run() {\n" +
" System.out.println("\"Hello World\");\n" +
" }\n" +
"}\n";
Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);
Runnable runner = (Runnable) aClass.newInstance();
runner.run();
I suggest making you class implement a "KnownInterface" as this will allow you to call/manipulate instances of you generated class.
I suggest making you class implement a KnownInterface of your choice as this will allow you to call/manipulate instances of you generated class.
Another more hacky way is to use this to override a class, provided it hasn't been loaded already.
This means you can redefine an existing class and provided the methods and fields used match,
you have compiler redefine a class and code already compiled to use the class will still work.
## Using the CachedCompiler.
In this example, you can configure the compiler to write the files to a speicifc directory when you are in debug mode.
private static final CachedCompiler JCC = CompilerUtils.DEBUGGING ?
new CachedCompiler(new File(parent, "src/test/java"), new File(parent, "target/compiled")) :
CompilerUtils.CACHED_COMPILER;
By selecting the src directory to match where your IDE looks for those files, it will allow your debugger to set into code you have generated at runtime.
Note: you may need to delete these files if you want to regenerate them.
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2013 Peter Lawrey
~ Copyright (C) 2015 higherfrequencytrading.com
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU Lesser General Public License as published by
~ the Free Software Foundation, either version 3 of the License.
~
~ http://www.apache.org/licenses/LICENSE-2.0
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU Lesser General Public License for more details.
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~ You should have received a copy of the GNU Lesser General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses />.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>net.openhft</groupId>
<artifactId>java-parent-pom</artifactId>
<version>1.0.1</version>
<version>1.1.10</version>
<relativePath />
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>compiler</artifactId>
<version>2.2.0</version>
<version>2.2.4</version>
<packaging>bundle</packaging>
<name>OpenHFT/Java-Runtime-Compiler</name>
......@@ -40,7 +39,7 @@
<groupId>net.openhft</groupId>
<artifactId>third-party-bom</artifactId>
<type>pom</type>
<version>3.4.0</version>
<version>3.5.0</version>
<scope>import</scope>
</dependency>
......@@ -55,12 +54,7 @@
</dependency>
<dependency>
<groupId>com.sun.java</groupId>
<artifactId>tools</artifactId>
</dependency>
<dependency>
<groupId>org.kohsuke.jetbrains</groupId>
<groupId>com.intellij</groupId>
<artifactId>annotations</artifactId>
</dependency>
......@@ -87,17 +81,51 @@
<build>
<plugins>
<!--
generate maven dependencies versions file that can be used later
to install the right bundle in test phase.
The file is:
target/classes/META-INF/maven/dependencies.properties
-->
<plugin>
<groupId>org.apache.servicemix.tooling</groupId>
<artifactId>depends-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-depends-file</id>
<goals>
<goal>generate-depends-file</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}
</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>OpenHFT :: ${project.artifactId}</Bundle-Name>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>
net.openhft.compiler.*;-noimport:=true
</Export-Package>
</instructions>
</configuration>
<executions>
<!--
This execution makes sure that the manifest is available
when the tests are executed
-->
<execution>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
......@@ -119,7 +147,7 @@
<connection>scm:git:git@github.com:OpenHFT/Java-Runtime-Compiler.git</connection>
<developerConnection>scm:git:git@github.com:OpenHFT/Java-Runtime-Compiler.git
</developerConnection>
<tag>compiler-2.2.0</tag>
<tag>compiler-2.2.4</tag>
</scm>
</project>
\ No newline at end of file
</project>
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......@@ -18,14 +20,16 @@ package net.openhft.compiler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticListener;
import javax.tools.JavaFileObject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
......@@ -34,6 +38,7 @@ import static net.openhft.compiler.CompilerUtils.writeText;
@SuppressWarnings("StaticNonFinalField")
public class CachedCompiler {
private static final Logger LOG = LoggerFactory.getLogger(CachedCompiler.class);
private static final Map<ClassLoader, Map<String, Class>> loadedClassesMap = new WeakHashMap<ClassLoader, Map<String, Class>>();
@Nullable
......@@ -41,7 +46,8 @@ public class CachedCompiler {
@Nullable
private final File classDir;
private final List<JavaFileObject> javaFileObjects = new ArrayList<JavaFileObject>();
private final Map<String, JavaFileObject> javaFileObjects =
new HashMap<String, JavaFileObject>();
public CachedCompiler(@Nullable File sourceDir, @Nullable File classDir) {
this.sourceDir = sourceDir;
......@@ -60,6 +66,8 @@ public class CachedCompiler {
return loadFromJava(getClass().getClassLoader(), className, javaCode);
}
private boolean errors;
@NotNull
Map<String, byte[]> compileFromJava(@NotNull String className, @NotNull String javaCode) {
Iterable<? extends JavaFileObject> compilationUnits;
......@@ -68,13 +76,28 @@ public class CachedCompiler {
File file = new File(sourceDir, filename);
writeText(file, javaCode);
compilationUnits = CompilerUtils.s_standardJavaFileManager.getJavaFileObjects(file);
} else {
javaFileObjects.add(new JavaSourceFromString(className, javaCode));
compilationUnits = javaFileObjects;
javaFileObjects.put(className, new JavaSourceFromString(className, javaCode));
compilationUnits = javaFileObjects.values();
}
// reuse the same file manager to allow caching of jar files
CompilerUtils.s_compiler.getTask(null, CompilerUtils.s_fileManager, null, null, null, compilationUnits).call();
return CompilerUtils.s_fileManager.getAllBuffers();
CompilerUtils.s_compiler.getTask(null, CompilerUtils.s_fileManager, new DiagnosticListener<JavaFileObject>() {
@Override
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
errors = true;
System.err.println(diagnostic);
}
}
}, null, null, compilationUnits).call();
Map<String, byte[]> result = CompilerUtils.s_fileManager.getAllBuffers();
if (errors) {
// compilation error, so we want to exclude this file from future compilation passes
if (sourceDir == null)
javaFileObjects.remove(className);
}
return result;
}
public Class loadFromJava(@NotNull ClassLoader classLoader, @NotNull String className, @NotNull String javaCode) throws ClassNotFoundException {
......@@ -100,7 +123,7 @@ public class CachedCompiler {
String filename = className2.replaceAll("\\.", '\\' + File.separator) + ".class";
boolean changed = writeBytes(new File(classDir, filename), bytes);
if (changed) {
LoggerFactory.getLogger(CachedCompiler.class).info("Updated {} in {}", className2, classDir);
LOG.info("Updated {} in {}", className2, classDir);
}
}
Class clazz2 = CompilerUtils.defineClass(classLoader, className2, bytes);
......@@ -108,7 +131,6 @@ public class CachedCompiler {
loadedClasses.put(className2, clazz2);
}
}
// CompilerUtils.s_fileManager.clearBuffers();
synchronized (loadedClassesMap) {
loadedClasses.put(className, clazz = classLoader.loadClass(className));
}
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......@@ -16,7 +18,6 @@
package net.openhft.compiler;
import com.sun.tools.javac.api.JavacTool;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
......@@ -25,19 +26,7 @@ import org.slf4j.LoggerFactory;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.ByteArrayInputStream;
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.lang.management.ManagementFactory;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
......@@ -49,12 +38,16 @@ import java.util.Arrays;
*/
public enum CompilerUtils {
;
private static final Logger LOGGER = LoggerFactory.getLogger(CompilerUtils.class);
public static final boolean DEBUGGING = ManagementFactory.getRuntimeMXBean().getInputArguments().contains("-Xdebug");
public static final boolean DEBUGGING = isDebug();
public static final CachedCompiler CACHED_COMPILER = new CachedCompiler(null, null);
private static final Logger LOGGER = LoggerFactory.getLogger(CompilerUtils.class);
private static final Method DEFINE_CLASS_METHOD;
private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final String JAVA_CLASS_PATH = "java.class.path";
static JavaCompiler s_compiler;
static StandardJavaFileManager s_standardJavaFileManager;
static MyJavaFileManager s_fileManager;
static {
try {
......@@ -65,23 +58,31 @@ public enum CompilerUtils {
}
}
static JavaCompiler s_compiler;
static StandardJavaFileManager s_standardJavaFileManager;
static MyJavaFileManager s_fileManager;
static {
reset();
}
private static boolean isDebug() {
String inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
return inputArguments.contains("-Xdebug")|| inputArguments.contains("-agentlib:jdwp=");
}
private static void reset() {
s_compiler = ToolProvider.getSystemJavaCompiler();
if (s_compiler == null)
s_compiler = JavacTool.create();
if (s_compiler == null) {
try {
Class<?> javacTool = Class.forName("com.sun.tools.javac.api.JavacTool");
Method create = javacTool.getMethod("create");
s_compiler = (JavaCompiler) create.invoke(null);
} catch (Exception e) {
throw new AssertionError(e);
}
}
s_standardJavaFileManager = s_compiler.getStandardFileManager(null, null, null);
s_fileManager = new MyJavaFileManager(s_standardJavaFileManager);
}
static {
reset();
}
/**
* Load a java class file from the classpath or local file system.
*
......@@ -124,6 +125,7 @@ public enum CompilerUtils {
}
if (!Arrays.asList(System.getProperty(JAVA_CLASS_PATH).split(File.pathSeparator)).contains(path))
System.setProperty(JAVA_CLASS_PATH, System.getProperty(JAVA_CLASS_PATH) + File.pathSeparator + path);
} else {
return false;
}
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......@@ -37,17 +39,14 @@ class MyJavaFileManager implements JavaFileManager {
}
public ClassLoader getClassLoader(Location location) {
// System.out.println("getClassLoader(" + location + ')');
return fileManager.getClassLoader(location);
}
public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {
// System.out.println("list(" + location + ',' + packageName + ',' + kinds + ',' + recurse + ')');
return fileManager.list(location, packageName, kinds, recurse);
}
public String inferBinaryName(Location location, JavaFileObject file) {
// System.out.println("inferBinaryName(location=" + location + ", file=" + file + ')');
return fileManager.inferBinaryName(location, file);
}
......@@ -60,12 +59,10 @@ class MyJavaFileManager implements JavaFileManager {
}
public boolean hasLocation(Location location) {
// System.out.println("hasLocation(" + location + ')');
return fileManager.hasLocation(location);
}
public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
// System.out.println("getJavaFileForInput(location=" + location + ", className=" + className + ", kind=" + kind + ')');
if (location == StandardLocation.CLASS_OUTPUT && buffers.containsKey(className) && kind == Kind.CLASS) {
final byte[] bytes = buffers.get(className).toByteArray();
return new SimpleJavaFileObject(URI.create(className), kind) {
......@@ -99,12 +96,10 @@ class MyJavaFileManager implements JavaFileManager {
}
public void flush() throws IOException {
// for (Map.Entry<String, ByteArrayOutputStream> entry : buffers.entrySet())
// System.out.println("Compiled " + entry.getKey() + ", size=" + entry.getValue().toByteArray().length);
// Do nothing
}
public void close() throws IOException {
// System.out.println("close()");
fileManager.close();
}
......
/*
* Copyright 2013 Peter Lawrey
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package eg;
import eg.components.BarImpl;
import eg.components.Foo;
import eg.components.TeeImpl;
import eg.components.Foo;
public class FooBarTee {
public class FooBarTee{
public final String name;
public final TeeImpl tee;
public final BarImpl bar;
......@@ -29,7 +13,7 @@ public class FooBarTee {
public FooBarTee(String name) {
// when viewing this file, ensure it is synchronised with the copy on disk.
System.out.println("generated test Tue Nov 06 20:54:52 GMT 2007");
System.out.println("generated test Tue Aug 11 07:09:54 BST 2015");
this.name = name;
tee = new TeeImpl("test");
......@@ -39,7 +23,7 @@ public class FooBarTee {
copy = new BarImpl(tee, 555);
// you should see the current date here after synchronisation.
foo = new Foo(bar, copy, "generated test Tue Nov 06 20:54:52 GMT 2007", 5);
foo = new Foo(bar, copy, "generated test Tue Aug 11 07:09:54 BST 2015", 5);
}
public void start() {
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......
/*
* Copyright 2013 Peter Lawrey
* Copyright 2014 Higher Frequency Trading
*
* http://www.higherfrequencytrading.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
......@@ -16,26 +18,28 @@
package net.openhft.compiler;
import com.sun.tools.internal.xjc.util.NullStream;
import eg.FooBarTee;
import eg.components.Foo;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
public class CompilerTest extends TestCase {
private static final String EG_FOO_BAR_TEE = "eg.FooBarTee";
static final File parent;
private static final String EG_FOO_BAR_TEE = "eg.FooBarTee";
private static final int RUNS = 1000 * 1000;
static {
File parent2 = new File("essence-file");
if (parent2.exists()) {
parent = parent2;
} else {
parent = new File(".");
}
......@@ -102,14 +106,16 @@ public class CompilerTest extends TestCase {
assertEquals(text, foo.s);
}
private static final int RUNS = 1000 * 1000;
public void test_fromFile() throws ClassNotFoundException, IOException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class clazz = CompilerUtils.loadFromResource("eg.FooBarTee2", "eg/FooBarTee2.jcf");
// turn off System.out
PrintStream out = System.out;
try {
System.setOut(new PrintStream(new NullStream()));
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
}
}));
final Constructor stringConstructor = clazz.getConstructor(String.class);
long start = 0;
for (int i = -RUNS / 10; i < RUNS; i++) {
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2013 Peter Lawrey
~ Copyright (C) 2015 higherfrequencytrading.com
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU Lesser General Public License as published by
~ the Free Software Foundation, either version 3 of the License.
~
~ http://www.apache.org/licenses/LICENSE-2.0
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU Lesser General Public License for more details.
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~ You should have received a copy of the GNU Lesser General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -28,7 +28,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>Java-Runtime-Compiler</artifactId>
<version>2.0-SNAPSHOT</version>
<version>2.2.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Java Compiler Parent</name>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment