2011-10-20 15 views
7

Mam starszą wersję projektu wojny, która zależy od projektu słoika, projekt słoika musi dodać kilka niezarządzanych słoików do kompilacji ścieżek klas. Ale tych słoików nie powinno się pakować w wojnę. Moje pytanie brzmi: jak usunąć te wpisy z fullClasspath. Następujące elementy nie będą działać:Usuń wpis z ścieżki klasy po kompilacji

val excludeFilter = "(servlet-api.jar)|(gwt-dev.jar)|(gwt-user.jar)" 
val filteredCP = cp.flatMap({ entry => 
    val jar = entry.data.getName() 
    if (jar.matches(excludeFilter)) { 
    Nil 
    } else { 
    Seq(entry) 
    } 
}) 
fullClasspath in Runtime = filteredCP 

Jestem prawie pewny, że musi istnieć prosty sposób, aby to zrobić, ale jak dotąd omija mnie.

Edit: Na podstawie sugestion Pablo wykorzystania zarządzanego ścieżki klasy zamiast niekontrolowana mogę przeformułować pytanie jako: jak można dodać lokalnych słoiki do managedClasspath. Moi słoiki są umieszczone w folderze lokalnym z (bardzo) układ niestandardowych:

lib/testng.jar 
lib/gwt/2.3/gwt-user.jar 
lib/jetty/servlet.jar 

Więc zasadniczo szukam czegoś podobnego:

libraryDependencies += "testng" % "provided->test" 
libraryDependencies += "gwt" % "2.3" % "gwt-user" % "provided->compile" 
libraryDependencies += "jetty" % "servlet" % "provided->default" 

pozwalając mi chwycić słoiki z własnego lokalnego folderu lib .

Odpowiedz

15

Niektóre informacje są umieszczone na stronie Classpaths, ale nie jest to bardzo jasne ani szczegółowe. Informacje są również dostępne za pomocą polecenia inspect, opisanego na stronie Inspecting Settings.

Zasadniczo, dla konfiguracji X, w notacji krótki ręki:

// complete, exported classpath, such as used by 
// 'run', 'test', 'console', and the war task 
fullClasspath in X = 
    dependencyClasspath in X ++ exportedProducts in X 

// classpath only containing dependencies, 
// used by 'compile' or 'console-quick', for example 
dependencyClasspath in X = 
    externalDependencyClasspath in X ++ internalDependencyClasspath in X 

// classpath containing only dependencies external to the build 
// (as opposed to the inter-project dependencies in internalDependencyClasspath) 
externalDependencyClasspath in X = 
    unmanagedClasspath in X ++ managedClasspath in X 

// the manually provided classpath 
unmanagedClasspath in X = 
    unmanagedJars for X and all configurations X extends, transitively 

Więc normalnie, gdy chcemy dodać bibliotek niezarządzanych, dodać je do unmanagedJars. Na przykład, jeśli dodasz biblioteki do unmanagedJars in Compile, sbt będzie poprawnie zawierał biblioteki unmanagedClasspath dla Compile, Runtime i Test.

Jednak chcesz tutaj uzyskać wyraźną kontrolę. Dodaj biblioteki tylko do unmanagedClasspath, które chcesz słoiki włączone, co jest unmanagedClasspath in Compile. Na przykład, w SBT 0.11.0+:

unmanagedClasspath in Compile <++= baseDirectory map { base => 
    val lib = base/"lib" 
    Seq(
    lib/"testng.jar", 
    lib/"gwt/2.3/gwt-user.jar", 
    lib/"jetty/servlet.jar" 
) 
} 

Zakładając plugin wojna wykorzystuje ścieżkę klas Runtime te słoiki pokaże tylko na ścieżce klasy kompilacji, a nie wojny.

3

sbt obsługuje ivy-like configurations i implementuje podstawowe zakresy maven.

Jeśli chcesz korzystać z niektórych słoików w swojej kompilacji ścieżki klasy, ale nie chce ich wysyłać, chyba zakres provided jest dla Ciebie:

libraryDependencies += "org.example" % "example" % "1.0" % "provided->compile" 
+0

Myślałem o tym, problem polega na tym, że nie możemy (polityka firmy, której nie mogę zmienić) używać bibliotek pobranych automatycznie (w tym ich przechodnich zależności). Tak więc każdy projekt zaćmienia ma folder lib, w którym umieszczane są słoiki, i nie byłem w stanie znaleźć przykładu użycia biblioteki LibraryDependencies z słoikami umieszczonymi lokalnie (wewnątrz projektu) w układzie bez bluszczu/maven (fx /lib/gwt/2.3/ gwt-user.jar /lib/gwt/2.3/gwt-dev.jar ...). –

Powiązane problemy