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 =
|
||||
{
|
||||
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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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