mirror of https://github.com/sbt/sbt.git
Fix duplicate classpath entries in jetty-run
This commit is contained in:
parent
3493aa5285
commit
186112ee57
|
|
@ -58,10 +58,15 @@ private object LazyJettyRun${jetty.version} extends JettyRun
|
||||||
|
|
||||||
def createLoader =
|
def createLoader =
|
||||||
{
|
{
|
||||||
class SbtWebAppLoader extends WebAppClassLoader(jettyLoader, webapp) { override def addURL(u: URL) = super.addURL(u) };
|
// Jetty treats WebAppClassLoader subclasses specially and we need this special behavior.
|
||||||
val loader = new SbtWebAppLoader
|
// However, Jetty adds extra classpath components directly using 'addURL'.
|
||||||
classpathURLs.foreach(loader.addURL)
|
// We only want the 'urls' we provide in the constructor, so 'addURL' is overridden to do nothing.
|
||||||
loader
|
class SbtWebAppLoader(urls: Seq[URL]) extends WebAppClassLoader(jettyLoader, webapp)
|
||||||
|
{
|
||||||
|
urls.foreach(super.addURL)
|
||||||
|
override def addURL(u: URL) = {}
|
||||||
|
}
|
||||||
|
new SbtWebAppLoader(classpathURLs)
|
||||||
}
|
}
|
||||||
def setLoader() = webapp.setClassLoader(createLoader)
|
def setLoader() = webapp.setClassLoader(createLoader)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.Collections
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
class MyServlet extends HttpServlet {
|
||||||
|
|
||||||
|
val html = <HTML>
|
||||||
|
<HEAD><TITLE>Hello, Scala!</TITLE></HEAD>
|
||||||
|
<BODY>Hello, Scala! This is a servlet.</BODY>
|
||||||
|
</HTML>
|
||||||
|
|
||||||
|
override def doGet(req:HttpServletRequest, resp:HttpServletResponse) {
|
||||||
|
val found = Collections.list(getClass.getClassLoader.getResources("test/MyServlet.class"))
|
||||||
|
assert( found.size == 1, "Multiple instances of MyServlet.class on classpath")
|
||||||
|
resp.setContentType("text/html")
|
||||||
|
resp.getWriter().print(html.toString)
|
||||||
|
}
|
||||||
|
def check28(f: Int = 3) = f
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.Collections
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
class MyServlet extends HttpServlet {
|
||||||
|
|
||||||
|
val html = <HTML>
|
||||||
|
<HEAD><TITLE>Hello, Scala 2!</TITLE></HEAD>
|
||||||
|
<BODY>Hello, Scala 2! This is a servlet.</BODY>
|
||||||
|
</HTML>
|
||||||
|
|
||||||
|
override def doGet(req:HttpServletRequest, resp:HttpServletResponse) {
|
||||||
|
val found = Collections.list(getClass.getClassLoader.getResources("test/MyServlet.class"))
|
||||||
|
assert( found.size == 1, "Multiple instances of MyServlet.class on classpath")
|
||||||
|
resp.setContentType("text/html")
|
||||||
|
resp.getWriter().print(html.toString)
|
||||||
|
}
|
||||||
|
def check28(f: Int = 3) = f
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
project.organization=tester
|
||||||
|
project.name=sbtweb
|
||||||
|
project.version=1.0
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
import sbt._
|
||||||
|
|
||||||
|
class WebappBuild(info: ProjectInfo) extends DefaultWebProject(info) {
|
||||||
|
|
||||||
|
override def libraryDependencies = if("jetty7".asFile.exists) jetty7Dependencies else jetty6Dependencies
|
||||||
|
def jetty6Dependencies =
|
||||||
|
Set("org.mortbay.jetty" % "servlet-api-2.5" % "6.1.14" % "provided->default",
|
||||||
|
"org.mortbay.jetty" % "jetty" % "6.1.14" % "test->default")
|
||||||
|
def jetty7Dependencies =
|
||||||
|
Set("javax.servlet" % "servlet-api" % "2.5" % "provided",
|
||||||
|
"org.eclipse.jetty" % "jetty-server" % "7.0.1.v20091125" % "test",
|
||||||
|
"org.eclipse.jetty" % "jetty-webapp" % "7.0.1.v20091125" % "test")
|
||||||
|
|
||||||
|
def indexURL = new java.net.URL("http://localhost:8080")
|
||||||
|
def indexFile = new java.io.File("index.html")
|
||||||
|
import Process._
|
||||||
|
lazy val getPage = execTask { indexURL #> indexFile }
|
||||||
|
lazy val checkPage = task { args => task { checkHelloWorld(args.mkString(" ")) } dependsOn getPage }
|
||||||
|
|
||||||
|
private def checkHelloWorld(checkString: String) =
|
||||||
|
{
|
||||||
|
val value = xsbt.FileUtilities.read(indexFile)
|
||||||
|
if(value.contains(checkString)) None else Some("index.html did not contain '" + checkString + "' :\n" +value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<!DOCTYPE web-app PUBLIC
|
||||||
|
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
|
||||||
|
"http://java.sun.com/dtd/web-app_2_3.dtd" >
|
||||||
|
|
||||||
|
<web-app>
|
||||||
|
<display-name>Test Web Application</display-name>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>Home</servlet-name>
|
||||||
|
<servlet-class>test.MyServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>Home</servlet-name>
|
||||||
|
<url-pattern>/</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
</web-app>
|
||||||
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
> ++2.8.0.Beta1
|
||||||
|
|
||||||
|
$ copy-file changes/MyServlet1.scala src/main/scala/test/MyServlet.scala
|
||||||
|
> update
|
||||||
|
> jetty-run
|
||||||
|
> check-page "Hello, Scala!"
|
||||||
|
|
||||||
|
$ copy-file changes/MyServlet2.scala src/main/scala/test/MyServlet.scala
|
||||||
|
|
||||||
|
> prepare-webapp
|
||||||
|
> jetty-reload
|
||||||
|
> check-page "Hello, Scala 2!"
|
||||||
|
|
||||||
|
> jetty-stop
|
||||||
|
-> check-page "Hello World 2!"
|
||||||
|
|
||||||
|
# test that it works with Jetty 7 support
|
||||||
|
$ touch jetty7
|
||||||
|
|
||||||
|
$ copy-file changes/MyServlet1.scala src/main/scala/test/MyServlet.scala
|
||||||
|
> update
|
||||||
|
> jetty-run
|
||||||
|
> check-page "Hello, Scala!"
|
||||||
|
|
||||||
|
$ copy-file changes/MyServlet2.scala src/main/scala/test/MyServlet.scala
|
||||||
|
|
||||||
|
> prepare-webapp
|
||||||
|
> jetty-reload
|
||||||
|
> check-page "Hello, Scala 2!"
|
||||||
|
|
||||||
|
> jetty-stop
|
||||||
|
-> check-page "Hello World 2!"
|
||||||
Loading…
Reference in New Issue