Fix duplicate classpath entries in jetty-run

This commit is contained in:
Mark Harrah 2010-03-04 16:34:27 -05:00
parent 3493aa5285
commit 186112ee57
7 changed files with 135 additions and 4 deletions

View File

@ -58,10 +58,15 @@ private object LazyJettyRun${jetty.version} extends JettyRun
def createLoader =
{
class SbtWebAppLoader extends WebAppClassLoader(jettyLoader, webapp) { override def addURL(u: URL) = super.addURL(u) };
val loader = new SbtWebAppLoader
classpathURLs.foreach(loader.addURL)
loader
// Jetty treats WebAppClassLoader subclasses specially and we need this special behavior.
// However, Jetty adds extra classpath components directly using 'addURL'.
// We only want the 'urls' we provide in the constructor, so 'addURL' is overridden to do nothing.
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)

View File

@ -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
}

View File

@ -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
}

View File

@ -0,0 +1,3 @@
project.organization=tester
project.name=sbtweb
project.version=1.0

View File

@ -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)
}
}

View File

@ -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>

View File

@ -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!"