2015-06-29 2 views
15
  • Windows 7
  • Java 1.8.0_45
  • Затмение Mars

Если система прокси настроен на HTTP, ниже будет печатать HTTP, только если он работает от main метода java-приложения.Можно обнаружить системные настройки прокси-сервера в приложении Java, но не в JUnit

Однако, если он вызван из теста JUnit 4 (в затмении), он всегда печатает DIRECT.

Также отмечено, что определение -Djava.net.useSystemProxies=true в eclipse: Запуск конфигураций -> Аргументы -> аргументы виртуальной машины. Тест просто зависает.

Любая идея, что происходит?

Спасибо большое,

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

Распечатайте содержимое System.getEnv() и System.getProperties() до стандартного в случае основного метода, а в случае JUnit и сравните их. Будет определенная разница, которая вызывает эту проблему. –

+0

Как настроить прокси? –

+0

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

ответ

3

попробовать сделать конфигурацию TestRunner (щелкните правой кнопкой мыши/RunAs ...) со следующими параметрами 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

Спасибо, но идеи не в том, чтобы указывать какие-либо значения, они должны быть частью набора тестов, где каждая машина обнаруживает конфигурацию из системы, будь то в maven или eclipse. –

2

Вы не можете изменить систему в Java поведение прокси-сервера во время выполнения. Системное свойство java.net.useSystemProxies считывается только при запуске. From the documentation (курсив):

java.net.useSystemProxies (по умолчанию: ложь)

На последних операционных системах Windows, а также на системах 2.x Gnome можно сказать стек java.net, установка этого свойство true, чтобы использовать настройки прокси-сервера системы (обе эти системы позволяют устанавливать прокси-серверы по всему миру через свой пользовательский интерфейс). Обратите внимание, что это свойство проверяется только один раз при запуске.

Установка системного имущества «на лету» не изменит поведение. Вы должны отправить его в качестве аргумента JVM, используя -D, как вы делаете с вашим методом main. Альтернативой было бы не использовать системные прокси, а вместо этого позволить пользователю предоставлять свои собственные.

В качестве альтернативы, другие свойства прокси-сервера, такие как http.proxyHost, http.proxyPort и т. Д. (Перечисленные в ссылке выше) могут быть изменены после запуска приложения. В зависимости от вашего приложения это может быть лучшим решением в любом случае, поскольку оно, как правило, будет иметь лучшую кросс-платформенную поддержку.

3

Настройки прокси-сервера, установленные в Eclipse, будут влиять на все инструменты, включая Eclipse и Maven. Это может быть причиной того, что у вас «зависает» ... возможно, это не был ваш тест JUnit, но сам maven висел (нужно уточнить).

Однако, в данном случае, мне кажется, что вы можете изменить свойства системы внутри плагина, отвечающего за 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]

В некоторых случаях система собственности используется только при запуске и работает только при его установке в командной строке.В этом случае, 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> 

Также обратите внимание, что если вы хотите, чтобы запустить его в мавена, вы должны выбрать 'Запуск -> Maven тест', а не 'Run As -> JUnit Test'.

[Разглагольствование Следит]

Я ненавижу говорить об этом - но на данный момент поддержка Proxies действительно бедных в Java.

Было сделано одно значительное улучшение: теперь вы можете определить отдельный прокси для каждого соединения, которое хотите установить. Тем не менее, я думаю, что это должно быть улучшено на много:

  1. Отдельная аутентификация на прокси-сервер. Теперь, хотя я могу определить прокси для каждого соединения, просто неестественно использовать одну и ту же аутентификацию для всех. Хуже того, он даже запускает ту же аутентификацию как для прокси, так и для HTTP-соединения: он не может отличить эти два четных.
  2. Лучшая поддержка прокси SOCKS
  3. Лучшая поддержка для запроса системы для настройки прокси. Каждая современная ОС теперь имеет конфигурацию для прокси-сервера по умолчанию.
  4. Встроенная поддержка и API для настоящих Socket Servers.

Звучит как напыщенность разочарованного программиста, но ответ заключается в их реализации! Является ли это достойным JEP?

+0

. Основная цель заключается в том, чтобы работать с Eclipse, конфигурация maven была добавлена, так как она висела, но тогда она стала прекрасной (возможно, проблема с прокси). +1 для запуска как -> тест maven, хотя эта функция находится на уровне pom, а не на отдельном тестовом примере (как JUnit) –