Add jdk jars to kotlin classpath

#KT-4214 Fixed
This commit is contained in:
Natalia Ukhorskaya
2013-12-23 18:29:30 +04:00
parent 4bc94e86c0
commit f2f1a1313d
36 changed files with 653 additions and 127 deletions
+13
View File
@@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="jps-model">
<CLASSES>
<root url="jar://$PROJECT_DIR$/ideaSDK/jps/jps-model.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-api/src" />
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-impl/src" />
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-serialization/src" />
</SOURCES>
</library>
</component>
@@ -75,7 +75,7 @@ public class BytecodeCompiler {
@NotNull String[] sourceRoots) {
KotlinPaths paths = getKotlinPathsForAntTask();
CompilerConfiguration configuration = new CompilerConfiguration();
configuration.add(CLASSPATH_KEY, PathUtil.findRtJar());
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
if ((stdlib != null) && (stdlib.trim().length() > 0)) {
configuration.add(CLASSPATH_KEY, new File(stdlib));
}
+2
View File
@@ -36,6 +36,7 @@
<fileset dir="${dependencies.dir}" includes="jansi.jar"/>
<fileset dir="${dependencies.dir}" includes="cli-parser-1.1.1.jar"/>
<fileset dir="${basedir}/js/js.translator/lib" includes="*.jar"/>
<fileset dir="${basedir}/ideaSDK/jps" includes="jps-model.jar"/>
</path>
<typedef resource="org/jetbrains/jet/buildtools/ant/antlib.xml" classpath="${bootstrap.compiler.home}/lib/kotlin-ant.jar"/>
@@ -279,6 +280,7 @@
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="jna-utils.jar"/>
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="oromatcher.jar"/>
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="protobuf-2.5.0.jar"/>
<zipgroupfileset dir="${basedir}/ideaSDK/jps" includes="jps-model.jar"/>
<zipgroupfileset dir="${basedir}/js/js.translator/lib" includes="*.jar"/>
<zipgroupfileset dir="${dependencies.dir}" includes="jline.jar"/>
<zipgroupfileset dir="${dependencies.dir}" includes="cli-parser-1.1.1.jar"/>
@@ -80,6 +80,8 @@ public class SpecialFiles {
excludedFiles.add("genericBackingFieldSignature.kt"); // Wrong signature after package renaming
excludedFiles.add("genericMethodSignature.kt"); // Wrong signature after package renaming
excludedFiles.add("classpath.kt"); // Some classes are not visible on android
}
private SpecialFiles() {
@@ -165,7 +165,7 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments> {
private static List<File> getClasspath(@NotNull KotlinPaths paths, @NotNull K2JVMCompilerArguments arguments) {
List<File> classpath = Lists.newArrayList();
if (!arguments.noJdk) {
classpath.add(PathUtil.findRtJar());
classpath.addAll(PathUtil.getJdkClassesRoots());
}
if (!arguments.noStdlib) {
classpath.add(paths.getRuntimePath());
@@ -98,7 +98,7 @@ public class CompileEnvironmentUtil {
if (runtimePath.exists()) {
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, runtimePath);
}
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.findRtJar());
configuration.addAll(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
File jdkAnnotationsPath = paths.getJdkAnnotationsPath();
if (jdkAnnotationsPath.exists()) {
configuration.add(JVMConfigurationKeys.ANNOTATIONS_PATH_KEY, jdkAnnotationsPath);
@@ -85,6 +85,11 @@ public class AntTaskTest extends KotlinIntegrationTestBase {
doJvmAntTest();
}
@Test
public void jvmClasspath() throws Exception {
doJvmAntTest();
}
@Test
public void antTaskJvmManyRoots() throws Exception {
doJvmAntTest();
@@ -0,0 +1,11 @@
OUT:
Buildfile: [TestData]/build.xml
build:
[kotlinc] Compiling [[[TestData]/hello.kt]] => [[Temp]/hello.jar]
[kotlinc] WARNING: [TestData]/hello.kt: (15, 9) Variable 'result' is never used
BUILD SUCCESSFUL
Total time: [time]
Return code: 0
@@ -0,0 +1,7 @@
<project name="Ant Task Test" default="build">
<taskdef resource="org/jetbrains/jet/buildtools/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
<target name="build">
<kotlinc src="${test.data}/hello.kt" output="${temp}/hello.jar"/>
</target>
</project>
@@ -0,0 +1,18 @@
package hello
import sun.nio.cs.SingleByte
import sun.net.spi.nameservice.dns.DNSNameService
import javax.crypto.Cipher
import com.sun.java.browser.plugin2.DOM
import com.sun.crypto.provider.AESCipher
fun main(args : Array<String>) {
val a = SingleByte() // charsets.jar
val c = DNSNameService() // dnsns.ajr
val e : Cipher? = null // jce.jar
val f : AESCipher? = null // sunjce_provider.jar
val j : DOM? = null // plugin.jar
val result = "$a$c$e$f$j"
println("OK")
}
@@ -0,0 +1,4 @@
OUT:
OK
Return code: 0
+4
View File
@@ -0,0 +1,4 @@
-src
$TESTDATA_DIR$/classpath.kt
-output
$TEMP_DIR$
+14
View File
@@ -0,0 +1,14 @@
import sun.nio.cs.SingleByte
import sun.net.spi.nameservice.dns.DNSNameService
import javax.crypto.Cipher
import com.sun.java.browser.plugin2.DOM
import com.sun.crypto.provider.AESCipher
fun box(): String {
val a = SingleByte() // charsets.jar
val c = DNSNameService() // dnsns.ajr
val e : Cipher? = null // jce.jar
val f : AESCipher? = null // sunjce_provider.jar
val j : DOM? = null // plugin.jar
return "OK"
}
+6
View File
@@ -0,0 +1,6 @@
WARNING: $TESTDATA_DIR$/classpath.kt: (8, 9) Variable 'a' is never used
WARNING: $TESTDATA_DIR$/classpath.kt: (9, 9) Variable 'c' is never used
WARNING: $TESTDATA_DIR$/classpath.kt: (10, 9) Variable 'e' is never used
WARNING: $TESTDATA_DIR$/classpath.kt: (11, 9) Variable 'f' is never used
WARNING: $TESTDATA_DIR$/classpath.kt: (12, 9) Variable 'j' is never used
OK
@@ -0,0 +1,14 @@
import sun.nio.cs.SingleByte
import sun.net.spi.nameservice.dns.DNSNameService
import javax.crypto.Cipher
import com.sun.java.browser.plugin2.DOM
import com.sun.crypto.provider.AESCipher
fun box() : String {
val a = SingleByte() // charsets.jar
val c = DNSNameService() // dnsns.ajr
val e : Cipher? = null // jce.jar
val f : AESCipher? = null // sunjce_provider.jar
val j : DOM? = null // plugin.jar
return "OK"
}
@@ -344,7 +344,12 @@ public class JetTestUtils {
@NotNull TestJdkKind jdkKind, @NotNull Collection<File> extraClasspath, @NotNull Collection<File> priorityClasspath) {
CompilerConfiguration configuration = new CompilerConfiguration();
configuration.addAll(CLASSPATH_KEY, priorityClasspath);
configuration.add(CLASSPATH_KEY, jdkKind == TestJdkKind.MOCK_JDK ? findMockJdkRtJar() : PathUtil.findRtJar());
if (jdkKind == TestJdkKind.MOCK_JDK) {
configuration.add(CLASSPATH_KEY, findMockJdkRtJar());
}
else {
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
}
if (configurationKind == ALL) {
configuration.add(CLASSPATH_KEY, ForTestCompileRuntime.runtimeJarForTests());
}
@@ -39,6 +39,11 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cli/jvm"), Pattern.compile("^(.+)\\.args$"), true);
}
@TestMetadata("classpath.args")
public void testClasspath() throws Exception {
doJvmTest("compiler/testData/cli/jvm/classpath.args");
}
@TestMetadata("diagnosticsOrder.args")
public void testDiagnosticsOrder() throws Exception {
doJvmTest("compiler/testData/cli/jvm/diagnosticsOrder.args");
@@ -480,6 +480,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/fullJdk"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("classpath.kt")
public void testClasspath() throws Exception {
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/classpath.kt");
}
@TestMetadata("genericBackingFieldSignature.kt")
public void testGenericBackingFieldSignature() throws Exception {
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/genericBackingFieldSignature.kt");
@@ -113,7 +113,7 @@ public class ResolveDescriptorsFromExternalLibraries {
System.out.println("Using file " + jar);
}
else {
jar = PathUtil.findRtJar();
jar = findRtJar();
System.out.println("Using rt.jar: " + jar);
}
@@ -138,6 +138,17 @@ public class ResolveDescriptorsFromExternalLibraries {
return hasErrors;
}
@NotNull
private static File findRtJar() {
List<File> roots = PathUtil.getJdkClassesRoots();
for (File root : roots) {
if (root.getName().equals("rt.jar") || root.getName().equals("classes.jar")) {
return root;
}
}
throw new IllegalArgumentException("No rt.jar/classes.jar found under " + System.getProperty("java.home"));
}
private boolean parseLibraryFileChunk(File jar, String libDescription, ZipInputStream zip, int classesPerChunk) throws IOException {
Disposable junk = new Disposable() {
@Override
@@ -153,8 +164,8 @@ public class ResolveDescriptorsFromExternalLibraries {
CompilerConfiguration configuration =
JetTestUtils.compilerConfigurationForTests(ConfigurationKind.JDK_AND_ANNOTATIONS, TestJdkKind.FULL_JDK);
jetCoreEnvironment = JetCoreEnvironment.createForTests(junk, configuration);
if (!PathUtil.findRtJar().equals(jar)) {
throw new RuntimeException("rt.jar mismatch: " + jar + ", " + PathUtil.findRtJar());
if (!findRtJar().equals(jar)) {
throw new RuntimeException("rt.jar mismatch: " + jar + ", " + findRtJar());
}
}
@@ -18,13 +18,14 @@ package org.jetbrains.jet.utils;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.java.impl.JavaSdkUtil;
import java.io.File;
import java.util.List;
public class PathUtil {
@@ -153,26 +154,7 @@ public class PathUtil {
}
@NotNull
public static File findRtJar() {
return findRtJar(System.getProperty("java.home"));
}
private static File findRtJar(String javaHome) {
if (SystemInfo.isMac && !SystemInfo.isJavaVersionAtLeast("1.7")) {
File classesJar = new File(new File(javaHome).getParentFile(), "Classes/classes.jar");
if (classesJar.exists()) {
return classesJar;
}
throw new IllegalArgumentException("No classes.jar found under " + classesJar.getParent());
}
else {
File rtJar = new File(javaHome, "lib/rt.jar");
if (rtJar.exists()) {
return rtJar;
}
throw new IllegalArgumentException("No rt.jar found under " + rtJar.getParent());
}
public static List<File> getJdkClassesRoots() {
return JavaSdkUtil.getJdkClassesRoots(new File(System.getProperty("java.home")), true);
}
}
+1
View File
@@ -11,6 +11,7 @@
<orderEntry type="module" module-name="util.runtime" exported="" />
<orderEntry type="module" module-name="Kotlin" exported="" />
<orderEntry type="library" exported="" name="kotlin-runtime" level="project" />
<orderEntry type="library" name="jps-model" level="project" />
</component>
</module>
@@ -67,7 +67,7 @@ public class GenerateJavaToKotlinMethodMap {
public static CharSequence generateText() throws IOException {
CompilerConfiguration configuration = new CompilerConfiguration();
configuration.add(CLASSPATH_KEY, PathUtil.findRtJar());
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
Disposable disposable = Disposer.newDisposable();
try {
@@ -47,7 +47,9 @@ public object JavaToKotlinTranslator {
fun setUpJavaCoreEnvironment(): JavaCoreProjectEnvironment {
val applicationEnvironment = JavaCoreApplicationEnvironment(DISPOSABLE)
val javaCoreEnvironment = JavaCoreProjectEnvironment(DISPOSABLE, applicationEnvironment)
javaCoreEnvironment.addJarToClassPath(PathUtil.findRtJar())
for (root in PathUtil.getJdkClassesRoots()) {
javaCoreEnvironment.addJarToClassPath(root)
}
val annotations: File? = findAnnotations()
if (annotations != null && annotations.exists()) {
javaCoreEnvironment.addJarToClassPath(annotations)
@@ -32,7 +32,7 @@ class PsiUtilsTest {
System.setProperty("java.awt.headless", "true")
val configuration = CompilerConfiguration()
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.findRtJar())
configuration.addAll(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.getJdkClassesRoots())
environment = JetCoreEnvironment.createForTests(rootDisposable, configuration)
}
@@ -21,90 +21,96 @@ class BasicKotlinGradleIT {
workingDir.mkdirs()
}
After fun tearDown() {
deleteRecursively(workingDir)
}
Test fun testCrossCompile() {
copyRecursively(File("src/test/resources/testProject/alfa"), workingDir)
val projectDir = File(workingDir, "alfa")
val project = Project("alfa")
val pathToKotlinPlugin = "-PpathToKotlinPlugin=" + File("local-repo").getAbsolutePath()
val cmd = if (SystemInfo.isWindows)
listOf("cmd", "/C", "gradlew.bat", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
else
listOf("/bin/bash", "./gradlew", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
val builder = ProcessBuilder(cmd)
builder.directory(projectDir)
builder.redirectErrorStream(true)
val process = builder.start()
val s = Scanner(process.getInputStream()!!)
val text = StringBuilder()
while (s.hasNextLine()) {
text append s.nextLine()
text append "\n"
project.build("compileDeployKotlin") {
assertSuccessful()
assertReportExists()
assertContains(":compileKotlin", ":compileTestKotlin", ":compileDeployKotlin")
}
s.close()
val result = process.waitFor()
val buildOutput = text.toString()
println(buildOutput)
assertEquals(result, 0)
assertTrue(buildOutput.contains(":compileKotlin"), "Should contain ':compileKotlin'")
assertTrue(buildOutput.contains(":compileTestKotlin"), "Should contain ':compileTestKotlin'")
assertTrue(buildOutput.contains(":compileDeployKotlin"), "Should contain ':compileDeployKotlin'")
assertTrue(File(projectDir, "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
// Run the build second time, assert everything is up-to-date
val up2dateBuilder = ProcessBuilder(cmd)
up2dateBuilder.directory(projectDir)
up2dateBuilder.redirectErrorStream(true)
val up2dateProcess = up2dateBuilder.start()
val up2dateProcessScanner = Scanner(up2dateProcess.getInputStream()!!)
val up2dateText = StringBuilder()
while (up2dateProcessScanner.hasNextLine()) {
up2dateText append up2dateProcessScanner.nextLine()
up2dateText append "\n"
project.build("compileDeployKotlin") {
assertSuccessful()
assertContains(":compileKotlin UP-TO-DATE", ":compileTestKotlin UP-TO-DATE", ":compileDeployKotlin UP-TO-DATE", ":compileJava UP-TO-DATE")
}
up2dateProcessScanner.close()
val up2dateResult = up2dateProcess.waitFor()
val up2dateBuildOutput = up2dateText.toString()
println(up2dateBuildOutput)
assertEquals(up2dateResult, 0)
assertTrue(up2dateBuildOutput.contains(":compileKotlin UP-TO-DATE"), "Should contain ':compileKotlin UP-TO-DATE'")
assertTrue(up2dateBuildOutput.contains(":compileTestKotlin UP-TO-DATE"), "Should contain ':compileTestKotlin UP-TO-DATE'")
assertTrue(up2dateBuildOutput.contains(":compileDeployKotlin UP-TO-DATE"), "Should contain ':compileDeployKotlin UP-TO-DATE'")
assertTrue(up2dateBuildOutput.contains(":compileJava UP-TO-DATE"), "Should contain ':compileJava UP-TO-DATE'")
}
Test fun testKotlinOnlyCompile() {
copyRecursively(File("src/test/resources/testProject/beta"), workingDir)
val projectDir = File(workingDir, "beta")
val project = Project("beta")
project.build("build") {
assertSuccessful()
assertReportExists()
assertContains(":compileKotlin", ":compileTestKotlin")
}
project.build("build") {
assertSuccessful()
assertContains(":compileKotlin UP-TO-DATE", ":compileTestKotlin UP-TO-DATE")
}
}
Test fun testKotlinClasspath() {
Project("classpathTest").build("build") {
assertSuccessful()
assertReportExists()
assertContains(":compileKotlin", ":compileTestKotlin")
}
}
class Project(val projectName: String)
class CompiledProject(val project: Project, val output: String, val resultCode: Int)
fun Project.build(command: String, check: CompiledProject.() -> Unit) {
copyRecursively(File("src/test/resources/testProject/$projectName"), workingDir)
val projectDir = File(workingDir, projectName)
val cmd = createCommand(command)
val process = createProcess(cmd, projectDir)
val (output, resultCode) = readOutput(process)
CompiledProject(this, output, resultCode).check()
}
private fun CompiledProject.assertSuccessful(): CompiledProject {
assertEquals(resultCode, 0)
return this
}
private fun CompiledProject.assertContains(vararg expected: String): CompiledProject {
for (str in expected) {
assertTrue(output.contains(str), "Should contain '$str', actual output: $output")
}
return this
}
private fun CompiledProject.assertReportExists(): CompiledProject {
assertTrue(File(File(workingDir, project.projectName), "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
return this
}
private fun createCommand(name: String): List<String> {
val pathToKotlinPlugin = "-PpathToKotlinPlugin=" + File("local-repo").getAbsolutePath()
val cmd = if (SystemInfo.isWindows)
listOf("cmd", "/C", "gradlew.bat", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
return if (SystemInfo.isWindows)
listOf("cmd", "/C", "gradlew.bat", name, "build", pathToKotlinPlugin, "--no-daemon", "--debug")
else
listOf("/bin/bash", "./gradlew", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
listOf("/bin/bash", "./gradlew", name, "build", pathToKotlinPlugin, "--no-daemon", "--debug")
}
private fun createProcess(cmd: List<String>, projectDir: File): Process {
val builder = ProcessBuilder(cmd)
builder.directory(projectDir)
builder.redirectErrorStream(true)
val process = builder.start()
return builder.start()
}
private fun readOutput(process: Process): Pair<String, Int> {
val s = Scanner(process.getInputStream()!!)
val text = StringBuilder()
while (s.hasNextLine()) {
@@ -114,37 +120,7 @@ class BasicKotlinGradleIT {
s.close()
val result = process.waitFor()
val buildOutput = text.toString()
println(buildOutput)
assertEquals(result, 0)
assertTrue(buildOutput.contains(":compileKotlin"), "Should contain ':compileKotlin'")
assertTrue(buildOutput.contains(":compileTestKotlin"), "Should contain ':compileTestKotlin'")
assertTrue(File(projectDir, "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
// Run the build second time, assert everything is up-to-date
val up2dateBuilder = ProcessBuilder(cmd)
up2dateBuilder.directory(projectDir)
up2dateBuilder.redirectErrorStream(true)
val up2dateProcess = up2dateBuilder.start()
val up2dateProcessScanner = Scanner(up2dateProcess.getInputStream()!!)
val up2dateText = StringBuilder()
while (up2dateProcessScanner.hasNextLine()) {
up2dateText append up2dateProcessScanner.nextLine()
up2dateText append "\n"
}
up2dateProcessScanner.close()
val up2dateResult = up2dateProcess.waitFor()
val up2dateBuildOutput = up2dateText.toString()
println(up2dateBuildOutput)
assertEquals(up2dateResult, 0)
assertTrue(up2dateBuildOutput.contains(":compileKotlin UP-TO-DATE"), "Should contain ':compileKotlin UP-TO-DATE'")
assertTrue(up2dateBuildOutput.contains(":compileTestKotlin UP-TO-DATE"), "Should contain ':compileTestKotlin UP-TO-DATE'")
return text.toString() to result
}
fun copyRecursively(source: File, target: File) {
@@ -163,7 +139,6 @@ class BasicKotlinGradleIT {
}
}
fun deleteRecursively(f: File): Unit {
if (f.isDirectory()) {
val children = f.listFiles()
@@ -0,0 +1,39 @@
buildscript {
repositories {
mavenCentral()
maven {
url 'file://' + pathToKotlinPlugin
}
}
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.1-SNAPSHOT'
}
}
apply plugin: "kotlin"
repositories {
maven {
url 'file://' + pathToKotlinPlugin
}
mavenCentral()
}
dependencies {
compile 'com.google.guava:guava:12.0'
testCompile 'org.testng:testng:6.8'
testRuntime 'org.jetbrains.kotlin:kotlin-stdlib:0.1-SNAPSHOT'
}
test {
useTestNG()
}
task show << {
buildscript.configurations.classpath.each { println it }
}
task wrapper(type: Wrapper) {
gradleVersion="1.4"
}
@@ -0,0 +1,6 @@
#Thu Feb 28 14:00:49 MSK 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip
@@ -0,0 +1,164 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
@@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@@ -0,0 +1,18 @@
package demo
import sun.nio.cs.SingleByte
import sun.net.spi.nameservice.dns.DNSNameService
import javax.crypto.Cipher
import com.sun.java.browser.plugin2.DOM
import com.sun.crypto.provider.AESCipher
fun box(): String {
val a = SingleByte() // charsets.jar
val c = DNSNameService() // dnsns.ajr
val e : Cipher? = null // jce.jar
val f : AESCipher? = null // sunjce_provider.jar
val j : DOM? = null // plugin.jar
return "OK"
}
@@ -0,0 +1,11 @@
package demo
import org.testng.Assert.*
import org.testng.annotations.Test as test
class TestSource() {
test fun f() {
assertEquals(box(), "OK")
}
}
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin.it</groupId>
<artifactId>test-classpath</artifactId>
<version>1.0</version>
<name>Test Hello World project</name>
<description>
Test the kotlin-maven-plugin:compile goal on test-classpath project.
</description>
<properties>
<kotlin.version>0.1-SNAPSHOT</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
</plugin>
</plugins>
</pluginManagement>
<!--suppress MavenModelInspection -->
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>process-test-sources</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,16 @@
package org.jetbrains
import sun.nio.cs.SingleByte
import sun.net.spi.nameservice.dns.DNSNameService
import javax.crypto.Cipher
import com.sun.java.browser.plugin2.DOM
import com.sun.crypto.provider.AESCipher
fun box(): String {
val a = SingleByte() // charsets.jar
val c = DNSNameService() // dnsns.ajr
val e : Cipher? = null // jce.jar
val f : AESCipher? = null // sunjce_provider.jar
val j : DOM? = null // plugin.jar
return "OK"
}
@@ -0,0 +1,13 @@
package org.jetbrains;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
public class HelloWorldJavaTest {
@Test
public void testClasspath() {
assertEquals("OK", org.jetbrains.JetbrainsPackage.box());
}
}
@@ -0,0 +1,7 @@
import java.io.*;
File file = new File( basedir, "target/test-classpath-1.0.jar" );
if (!file.exists() || !file.isFile())
{
throw new FileNotFoundException( "Could not find generated JAR: " + file );
}