2013-06-09 8 views
7

Vedo un vaso con scope provided nel mio percorso di classe durante l'esecuzione del test. Data la definizione dell'ambito provided, non mi aspetto che jar venga visualizzato nel classpath durante qualsiasi fase di esecuzione.Escludendo le dipendenze dell'ambito "fornite" durante la fase di esecuzione "test"?

Ho confermato che l'ambito è corretto utilizzando la vista "Gerarchia delle dipendenze" di M2E. Ho già provato con l'opzione classpathDependencyScopeExclude in maven-surefire-plugin per mantenere la dipendenza da presentarsi, e non ha funzionato:

<build> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.14.1</version> 
     <configuration> 
      <!-- 
      We always want to exclude provided deps. I'm not sure why this 
      isn't the default. 
      --> 
      <classpathDependencyScopeExclude>provided</classpathDependencyScopeExclude> 
     </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

Ecco la definizione di dipendenza in questione:

Parent POM:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>jsr311-api</artifactId> 
    <version>1.1.1</version> 
</dependency> 

Modulo POM:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>jsr311-api</artifactId> 
    <scope>provided</scope> 
</dependency> 

È normale che il barattolo sia lì? Cosa posso fare per evitare che si mostri?

MODIFICA: Ho eseguito mvn dependency:tree sul padre POM. Ecco l'output del progetto in questione:

[INFO] ------------------------------------------------------------------------ 
[INFO] Building sibyl.transport.impl.http.server 0.0.1-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ sibyl.transport.impl.http.server --- 
[INFO] com.sigpwned.analytics:sibyl.transport.impl.http.server:jar:0.0.1-SNAPSHOT 
[INFO] +- com.sigpwned.analytics:sibyl.transport:jar:0.0.1-SNAPSHOT:compile 
[INFO] +- com.sigpwned.analytics:commons:jar:0.0.1-SNAPSHOT:compile 
[INFO] +- javax.ws.rs:jsr311-api:jar:1.1.1:provided 
[INFO] +- com.sun.jersey:jersey-server:jar:1.17.1:test (scope not updated to compile) 
[INFO] | +- asm:asm:jar:3.1:test 
[INFO] | \- com.sun.jersey:jersey-core:jar:1.17.1:test 
[INFO] +- com.sun.jersey:jersey-servlet:jar:1.17.1:compile 
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.0.3.v20130506:test 
[INFO] | \- org.eclipse.jetty:jetty-security:jar:9.0.3.v20130506:test 
[INFO] |  \- org.eclipse.jetty:jetty-server:jar:9.0.3.v20130506:test 
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:test 
[INFO] |  +- org.eclipse.jetty:jetty-http:jar:9.0.3.v20130506:test 
[INFO] |  | \- org.eclipse.jetty:jetty-util:jar:9.0.3.v20130506:test 
[INFO] |  \- org.eclipse.jetty:jetty-io:jar:9.0.3.v20130506:test 
[INFO] +- com.sigpwned.analytics:sibyl.transport.impl.http.client:jar:0.0.1-SNAPSHOT:test 
[INFO] | \- org.apache.httpcomponents:httpclient:jar:4.2.5:test 
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.2.4:test 
[INFO] |  +- commons-logging:commons-logging:jar:1.1.1:test 
[INFO] |  \- commons-codec:commons-codec:jar:1.6:test 
[INFO] \- junit:junit:jar:4.11:test 
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test 

Nuovamente, il vaso con condizione ambito che mi aspetto non mostrare sul classpath ma non fa l'API specifica JAX-RS, come mostrato sopra javax.ws.rs:jsr311-api:jar:1.1.1:provided. Credo che ciò confermi che questa dipendenza appare solo nell'ambito provided.

EDIT: Se corro il test, qui è la riga di comando che viene eseguito (da ps):

sigpwned  11771 0.0 1.2 4019788 100240 ?? S 10:58PM 0:05.92 /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:59974 -Dfile.encoding=UTF-8 -classpath /Users/aboothe/Documents/workspaces/w2oanalytics/sibyl.transport.impl.http.server/target/test-classes:/Users/aboothe/Documents/workspaces/w2oanalytics/sibyl.transport.impl.http.server/target/classes:/Users/aboothe/Documents/workspaces/w2oanalytics/sibyl/sibyl.transport/target/classes:/Users/aboothe/Documents/workspaces/w2oanalytics/commons/target/classes:/Users/aboothe/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar:/Users/aboothe/.m2/repository/com/sun/jersey/jersey-server/1.17.1/jersey-server-1.17.1.jar:/Users/aboothe/.m2/repository/asm/asm/3.1/asm-3.1.jar:/Users/aboothe/.m2/repository/com/sun/jersey/jersey-core/1.17.1/jersey-core-1.17.1.jar:/Users/aboothe/.m2/repository/com/sun/jersey/jersey-servlet/1.17.1/jersey-servlet-1.17.1.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-servlet/9.0.3.v20130506/jetty-servlet-9.0.3.v20130506.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-security/9.0.3.v20130506/jetty-security-9.0.3.v20130506.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-server/9.0.3.v20130506/jetty-server-9.0.3.v20130506.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-http/9.0.3.v20130506/jetty-http-9.0.3.v20130506.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-util/9.0.3.v20130506/jetty-util-9.0.3.v20130506.jar:/Users/aboothe/.m2/repository/org/eclipse/jetty/jetty-io/9.0.3.v20130506/jetty-io-9.0.3.v20130506.jar:/Users/aboothe/Documents/workspaces/w2oanalytics/sibyl.transport.impl.http.client/target/classes:/Users/aboothe/.m2/repository/org/apache/httpcomponents/httpclient/4.2.5/httpclient-4.2.5.jar:/Users/aboothe/.m2/repository/org/apache/httpcomponents/httpcore/4.2.4/httpcore-4.2.4.jar:/Users/aboothe/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar:/Users/aboothe/.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar:/Users/aboothe/.m2/repository/junit/junit/4.11/junit-4.11.jar:/Users/aboothe/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/Users/aboothe/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/350/1/.cp/:/Users/aboothe/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/349/1/.cp/ org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3 -port 59973 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames com.sigpwned.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests 

Se si stacca il percorso di classe, ecco cosa che assomiglia:

/Users/sigpwned/Documents/workspaces/siganalytics/sibyl.transport.impl.http.server/target/test-classes 
/Users/sigpwned/Documents/workspaces/siganalytics/sibyl.transport.impl.http.server/target/classes 
/Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport/target/classes 
/Users/sigpwned/Documents/workspaces/siganalytics/commons/target/classes 
/Users/sigpwned/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar 
/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-server/1.17.1/jersey-server-1.17.1.jar 
/Users/sigpwned/.m2/repository/asm/asm/3.1/asm-3.1.jar 
/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-core/1.17.1/jersey-core-1.17.1.jar 
/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-servlet/1.17.1/jersey-servlet-1.17.1.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-servlet/9.0.3.v20130506/jetty-servlet-9.0.3.v20130506.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-security/9.0.3.v20130506/jetty-security-9.0.3.v20130506.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-server/9.0.3.v20130506/jetty-server-9.0.3.v20130506.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-http/9.0.3.v20130506/jetty-http-9.0.3.v20130506.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-util/9.0.3.v20130506/jetty-util-9.0.3.v20130506.jar 
/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-io/9.0.3.v20130506/jetty-io-9.0.3.v20130506.jar 
/Users/sigpwned/Documents/workspaces/siganalytics/sibyl.transport.impl.http.client/target/classes 
/Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpclient/4.2.5/httpclient-4.2.5.jar 
/Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpcore/4.2.4/httpcore-4.2.4.jar 
/Users/sigpwned/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar 
/Users/sigpwned/.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar 
/Users/sigpwned/.m2/repository/junit/junit/4.11/junit-4.11.jar 
/Users/sigpwned/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar 
/Users/sigpwned/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/350/1/.cp/ 
/Users/sigpwned/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/349/1/.cp/ 

EDIT: Dopo aver esaminato la documentazione classpathDependencyScopeExclude, ho deciso che è possibile escludere solo compile, runtime e test dipendenze, non provided. Questo spiega perché questa funzionalità non funziona. Dopo aver provato il suggerimento di @hello di seguito, ho determinato che classpathDependencyExclude funziona quando si esegue direttamente con Maven. Ecco il percorso di classe che ho strappato fuori MANIFESTO del vaso infallibile:

file:/Users/sigpwned/.m2/repository/org/apache/maven/surefire/surefire-booter/2.14.1/surefire-booter-2.14.1.jar 
    file:/Users/sigpwned/.m2/repository/org/apache/maven/surefire/surefire-api/2.14.1/surefire-api-2.14.1.jar 
    file:/Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport.impl.http.server/target/test-classes/ 
    file:/Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport.impl.http.server/target/classes/ 
    file:/Users/sigpwned/.m2/repository/com/siggroup/analytics/sibyl.transport/0.0.1-SNAPSHOT/sibyl.transport-0.0.1-SNAPSHOT.jar 
    file:/Users/sigpwned/.m2/repository/com/siggroup/analytics/commons/0.0.1-SNAPSHOT/commons-0.0.1-SNAPSHOT.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-server/9.0.3.v20130506/jetty-server-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-http/9.0.3.v20130506/jetty-http-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-util/9.0.3.v20130506/jetty-util-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-io/9.0.3.v20130506/jetty-io-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-servlet/9.0.3.v20130506/jetty-servlet-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-security/9.0.3.v20130506/jetty-security-9.0.3.v20130506.jar 
    file:/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-server/1.17.1/jersey-server-1.17.1.jar 
    file:/Users/sigpwned/.m2/repository/asm/asm/3.1/asm-3.1.jar 
    file:/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-core/1.17.1/jersey-core-1.17.1.jar 
    file:/Users/sigpwned/.m2/repository/com/sun/jersey/jersey-servlet/1.17.1/jersey-servlet-1.17.1.jar 
    file:/Users/sigpwned/.m2/repository/com/siggroup/analytics/sibyl.transport.impl.http.client/0.0.1-SNAPSHOT/sibyl.transport.impl.http.client-0.0.1-SNAPSHOT.jar 
    file:/Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpclient/4.2.4/httpclient-4.2.4.jar 
    file:/Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpcore/4.2.4/httpcore-4.2.4.jar 
    file:/Users/sigpwned/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar 
    file:/Users/sigpwned/.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar 
    file:/Users/sigpwned/.m2/repository/com/siggroup/analytics/sibyl.transport/0.0.1-SNAPSHOT/sibyl.transport-0.0.1-SNAPSHOT-tests.jar 
    file:/Users/sigpwned/.m2/repository/junit/junit/4.11/junit-4.11.jar 
    file:/Users/sigpwned/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar 

noti che jsr311-api.jar non è presente. Successo! Ecco la configurazione che ha funzionato:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${maven-surefire-plugin.version}</version> 
    <configuration> 
    <!-- 
     We never want to include these API deps on an execution classpath. 
     I would think this is how the "provided" scope works - just 
     compile against the jar, and then I'll bring it myself at 
     execution time - but provided is only excluded during the runtime 
     phase, not the testing phase. So, we have to exclude all our 
     API JARs by hand. 
    --> 
    <classpathDependencyExcludes> 
     <classpathDependencyExclude>javax.ws.rs:jsr311-api</classpathDependencyExclude> 
    </classpathDependencyExcludes> 
    <includes> 
     <include>**/*Tests.*</include> 
    </includes> 
    </configuration> 
</plugin> 

Tuttavia, questa soluzione non non sembrano funzionare su M2E. Ecco il percorso di classe che ho tirato fuori da un ps durante l'esecuzione del test con M2E:

/Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport.impl.http.server/target/test-classes 
    /Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport.impl.http.server/target/classes 
    /Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport/target/classes 
    /Users/sigpwned/Documents/workspaces/siganalytics/commons/target/classes 
> /Users/sigpwned/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-server/9.0.3.v20130506/jetty-server-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-http/9.0.3.v20130506/jetty-http-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-util/9.0.3.v20130506/jetty-util-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-io/9.0.3.v20130506/jetty-io-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-servlet/9.0.3.v20130506/jetty-servlet-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/org/eclipse/jetty/jetty-security/9.0.3.v20130506/jetty-security-9.0.3.v20130506.jar 
    /Users/sigpwned/.m2/repository/com/sun/jersey/jersey-server/1.17.1/jersey-server-1.17.1.jar 
    /Users/sigpwned/.m2/repository/asm/asm/3.1/asm-3.1.jar 
    /Users/sigpwned/.m2/repository/com/sun/jersey/jersey-core/1.17.1/jersey-core-1.17.1.jar 
    /Users/sigpwned/.m2/repository/com/sun/jersey/jersey-servlet/1.17.1/jersey-servlet-1.17.1.jar 
    /Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport.impl.http.client/target/classes 
    /Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpclient/4.2.4/httpclient-4.2.4.jar 
    /Users/sigpwned/.m2/repository/org/apache/httpcomponents/httpcore/4.2.4/httpcore-4.2.4.jar 
    /Users/sigpwned/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar 
    /Users/sigpwned/.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar 
    /Users/sigpwned/Documents/workspaces/siganalytics/sibyl/sibyl.transport/target/test-classes 
    /Users/sigpwned/.m2/repository/junit/junit/4.11/junit-4.11.jar 
    /Users/sigpwned/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar 
    /Users/sigpwned/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/350/1/.cp/ 
    /Users/sigpwned/Downloads/eclipse/configuration/org.eclipse.osgi/bundles/349/1/.cp/ 

Purtroppo, jsr311-api.jar è ancora lì.Questo mi porta a credere che questa domanda abbia una risposta (con quella risposta che è "usa classpathDependencyExcludes"), ma c'è un bug in M2E. Ho eseguito "Verifica aggiornamenti" in Eclipse e non ho trovato alcun aggiornamento per M2E, quindi dovrei eseguire l'ultima versione stabile. Inserirò un bug su M2E e aggiornerò qui il problema in modo che chiunque possa trovare questo problema possa tenere traccia.

EDIT: questo problema è stato already raised con M2E, e la risposta sembra essere "l'integrazione infallibile è al di fuori del campo di applicazione del M2E in questo momento." Non incoraggiante. :/

+0

Forse la dipendenza è inclusa altrove come dipendenza di runtime, o forse qualcos'altro sta importando la stessa libreria. Hai provato a eseguire il comando dell'albero delle dipendenze e a cercare il nome della risorsa all'interno di esso? –

+0

@EngineerDollery Non credo che sia così. Ho aggiunto alcune informazioni aggiuntive alla domanda che spiega perché. Grazie per il suggerimento! – sigpwned

+0

@sigpwned Perché non inserisci le tue modifiche importanti come risposta e le accetti? Per me sembrano una soluzione al problema invece della risposta attualmente accettata. – fnt

risposta

7

Data la definizione dello scope provided, non mi aspetto che jar venga visualizzato nel classpath durante qualsiasi fase di esecuzione.

Questo non è esattamente il comportamento dell'ambito provided; vedi Dependency Scope. Lo scope provided, in comune con compile, è per le classi necessarie per compilare e testare le classi. Se mancassero durante test allora si avrebbe un NoClassDefFoundError.

La differenza arriva durante l'imballaggio e la distribuzione, dove questi elementi vengono omessi da war s presupponendo che l'ambiente di destinazione (ad esempio, un contenitore servlet) fornirà la propria copia delle stesse classi.

+0

Evidentemente così! Tuttavia, come posso indicare che una dipendenza è solo per la compilazione e non dovrebbe mai apparire sul classpath durante una fase di esecuzione (incluso il test)? – sigpwned

+1

Ho trovato che 'classpathDependencyScopeExclude' non ha funzionato ma [' classpathDependencyExcludes'] (http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#classpathDependencyExcludes) ha: javax.ws.rs:jsr311-api In generale, non c'è alcuna possibilità che corrisponde a quello che stai dopo. Dovresti escluderlo per ogni obiettivo. – Joe

+1

Funziona! (Si noti che la sintassi è ' groupId: artifactId', tuttavia.) Ho accettato la risposta e ho udpato la mia domanda. Grazie! – sigpwned

Problemi correlati