Since Java 9, calling objects defined in java.sql from within Scala throw a java.lang.SecurityException when used directly from a scala script.
Java Version: 10.0.1
Scala Version: 2.12.4
sbt Version: 1.2.0
The below screenshot is an entire minimum working example, with console output for a working and non-working version. Specifically: copying the script code into a class, and running it from that class, resolves the issue. Is there a way to write a Scala script that directly uses objects from java.sql
?
build.sbt
name := "mypackage"
version := "0.1"
scalaVersion := "2.12.4"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.4"
broken-script.scala
import java.sql.{Connection, DriverManager}
import java.util.Properties
object Main {
private def url = "jdbc:postgresql://localhost:5432/postgres"
val credentials: Properties ={
val properties = new Properties()
properties.setProperty("user", "integration_test")
properties.setProperty("password", "integration-pass")
properties
}
def connect(): Connection =
DriverManager.getConnection(url, credentials)
def run(): Unit = {
connect()
}
}
Main.run()
As shown in the console output below, broken-script.scala
encounters a SecurityException.
brokenScript.scala Output
:load scripts/broken-script.scala
Loading scripts/broken-script.scala...
import java.sql.{Connection, DriverManager}
import java.util.Properties
defined object Main
java.lang.securityException: Prohibited package name: java.sql
at java.base/java/lang.ClassLoader.preDefineClass(ClassLoader.java:891)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java 1007)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:545)
at java.base/java.net.URLClassLoader.access$100(URLClassLoader.java:83)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:453)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:447)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/net.URLClassLoader.findClass(URLClassLoader.java:446)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:553)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
at Main$.connect(scripts/broken-script.scala:26)
at Main$.run(scripts/broken-script.scala:30)
src/main/scala/mypackage/Main.scala
package mypackage
import java.sql.{Connection, DriverManager}
import java.util.Properties
object Main {
private def url = "jdbc:postgresql://localhost:5432/postgres"
val credentials: Properties ={
val properties = new Properties()
properties.setProperty("user", "integration_test")
properties.setProperty("password", "integration-pass")
properties
}
def connect(): Connection =
DriverManager.getConnection(url, credentials)
def run(): Unit = {
connect()
}
}
working-script.scala
mypackage.Main.run()
println("Success")
An image of the entire project.