2015-06-29 14 views
15
  • Windows 7
  • Java 1.8.0_45
  • Eclipse Marte

Se avete delega sistema istituito a HTTP, il seguito stampa HTTP solo se viene eseguito dal metodo main dell'applicazione java.sistema in grado di rilevare impostazioni proxy in un'applicazione Java, ma non in JUnit

Tuttavia, se viene chiamato dal test JUnit 4 (in eclissi), stampa sempre DIRECT.

Si noti inoltre che la definizione di -Djava.net.useSystemProxies=true in eclissi: Esegui configurazioni -> Argomenti -> Argomenti VM. Il test semplicemente si blocca.

Qualche idea su cosa sta succedendo?

Grazie mille,

public void printSystemProxy() { 
    System.setProperty("java.net.useSystemProxies", "true"); 
    try { 
     final List<Proxy> list = ProxySelector.getDefault().select(new URI("http://foo/bar")); 
     for (final Proxy proxy : list) { 
      System.out.println(proxy.type()); 
     } 
    } 
    catch (final URISyntaxException e) { 
     throw new IllegalStateException(e); 
    } 
} 
+0

Stampare il contenuto di System.getEnv() e System.getProperties() sullo standard out in caso di metodo principale e in caso di JUnit e confrontarli. Ci sarà sicuramente qualche differenza, che causa questo problema. –

+0

Come si imposta il proxy? –

+0

http://windows.microsoft.com/en-us/windows/change-internet-explorer-proxy-server-settings#1TC=windows-7 –

risposta

3

provare a fare una configurazione TestRunner (tasto destro del mouse/RunAs ...) con i seguenti parametri VM:

-Dhttp.proxyHost=<YOUR_PROXY> 
-Dhttp.proxyPort=<YOUR_PORT> 
-Dhttp.nonProxyHosts=<IF YOU NEED THIS (pipe as separator)> 
-Dhttp.proxyUser=<YOUR_NAME> 
-Dhttp.proxyPassword=<YOUR_PASWORD> 
+0

Grazie, ma le idee non sono di specificare alcun valore, dovrebbe essere parte della suite di test, dove ogni macchina rileva la configurazione dal sistema, sia in Maven che in eclissi –

2

Non è possibile cambiare sistema di Java comportamento proxy su runtime. La proprietà di sistema java.net.useSystemProxies viene letta solo all'avvio. From the documentation (enfasi aggiunta):

java.net.useSystemProxies (default: false)

Su sistemi Windows recenti e sui sistemi di 2.x di Gnome, è possibile dire al catasta java.net, l'impostazione di questa proprietà true, per utilizzare le impostazioni del proxy di sistema (entrambi questi sistemi consentono di impostare i proxy a livello globale attraverso la loro interfaccia utente). Si noti che questa proprietà viene verificata solo una volta all'avvio.

L'impostazione della proprietà di sistema al volo non modifica il comportamento. Devi inviarlo come argomento JVM usando -D come stai facendo con il tuo metodo main. Un'alternativa sarebbe quella di non utilizzare i proxy di sistema e invece consentire all'utente di fornire il proprio.

In alternativa, le altre proprietà del proxy come http.proxyHost, http.proxyPort, ecc. (Elencate nel collegamento della documentazione sopra) possono essere modificate dopo l'avvio dell'applicazione. A seconda dell'applicazione, questa potrebbe essere una soluzione migliore in ogni caso, poiché generalmente avrà un supporto multipiattaforma migliore.

3

Le impostazioni del proxy impostate in Eclipse influenzeranno tutti gli strumenti inclusi Eclipse e Maven stesso. Questo potrebbe essere il motivo per cui hai avuto un "blocco" ... potrebbe non essere stato il tuo test JUnit, ma lo stesso maven è appeso (serve un chiarimento).

Tuttavia, in questo caso, mi sembra che è possibile cambiare la proprietà del sistema all'interno del plug-responsabile per i test JUnit:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <systemPropertyVariables> 
     <java.net.useSystemProxies>true</java.net.useSystemProxies> 
     </systemPropertyVariables> 
    </configuration> 
    </plugin> 

[UPDATE]

In alcuni casi la proprietà di sistema viene utilizzato solo all'avvio e funziona solo quando lo si imposta sulla riga di comando.In tal caso, you can supply it as part of the command-line arguments:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <argLine>-Djava.net.useSystemProxies=true</argLine> 
    </configuration> 
    </plugin> 

noti inoltre che se si desidera eseguire dall'interno Maven, si deve scegliere 'Esegui come -> Maven test', e non 'Run As -> JUnit Test'.

[Ranting Segue]

Odio dire questo - ma a questo punto il supporto per i proxy è davvero scadente entro Java.

Un miglioramento importante è stato mai apportato: ora è possibile definire un Proxy separato per ogni connessione che si desidera stabilire. Tuttavia, penso che questo dovrebbe essere migliorato molto:

  1. Autenticazione separata per proxy. Ora, anche se posso definire proxy per connessione, è semplicemente innaturale usare la stessa autenticazione per tutti. Peggio ancora, fa scattare la stessa autenticazione sia per la connessione proxy che per quella HTTP: non è in grado di distinguere questi due valori.
  2. Supporto migliore per i proxy SOCKS
  3. Supporto migliore per interrogare il sistema per l'installazione del proxy. Ogni sistema operativo moderno ora ha una configurazione per il proxy predefinito.
  4. Supporto integrato e API per i socket server effettivi.

Suona come il richiamo di un programmatore disilluso, ma la risposta è nella realizzazione di questi! Questo è degno di un JEP?

+0

Lo scopo principale è quello di girare con Eclipse, la configurazione di maven è stata aggiunta da quando era appesa, ma poi è andata bene (probabilmente il problema del proxy). +1 per eseguire come -> test maven, anche se quella funzione è a livello di pom, non su singoli casi di test (come JUnit) –

Problemi correlati