Ustaw flagi JVM http.proxyHosti http.proxyPortpodczas uruchamiania JVM w wierszu polecenia. Zwykle odbywa się to w skrypcie powłoki (w systemie Unix) lub w pliku bat (w systemie Windows). Oto przykład ze skryptem powłoki Uniksa:
„proxySet” nic nie robi. Dowód: ustaw na „fałsz”. Nie ma i nigdy nie było takiej właściwości w JDK, pomimo różnych książek i referencji online. Pochodzi z od dawna nieistniejącego HotJavaBean, zamkniętej przeglądarki, zmarł śmiercią około 1998 roku.
Markiz Lorne
2
Naprawdę są nazwy właściwości bez http / https?
Betlista
18
Jest to błędne z trzech powodów: 1: jak wspomniano, nie ma elementu „proxySet”; 2: „proxyHost” i „proxyPort” muszą być „http.proxyHost” i „http.proxyPort” (lub odpowiednikiem „https”); 3: System.getProperty (). Put (X, Y) to nie to samo co System.setProperty (X, Y). Ale poza tym - świetna odpowiedź.
@RobCranfill 1: „proxySet” był niestandardową flagą, która była potrzebna przez stary JDK, ale nie jest już konieczna; 2: działają „proxyHost” i „proxyPort”, „http”. prefiks ogranicza je tylko do protokołu HTTP (podobnie jak w przypadku „https.”), 3: masz rację.
import java.net.Authenticator;importProxyAuthenticator;publicclassExample{publicstaticvoid main(String[] args){String username =System.getProperty("proxy.authentication.username");String password =System.getProperty("proxy.authentication.password");if(username !=null&&!username.equals("")){Authenticator.setDefault(newProxyAuthenticator(username, password));}// here your JVM will be authenticated}}
to nie działa. jeśli nie jesteś jeszcze uwierzytelniony, pierwszy wiersz funkcji głównej otrzymuje wiązkę wartości zerowych i kod zatrzymuje się. To nie pomaga komuś uwierzytelnić swojego pliku Jvm, aby mógł wykonywać połączenia URL przez serwer proxy.
Randnum,
12
Łączenie odpowiedzi Sortera i javabretta / Leonela:
Ustaw java.net.useSystemProxieswłaściwość na true. Możesz to ustawić na przykład za pomocą zmiennej środowiskowej JAVA_TOOL_OPTIONS . W Ubuntu możesz na przykład dodać następujący wiersz .bashrc:
Poniżej pokazano, jak ustawić w Javie proxy z użytkownikiem proxy i hasłem proxy z wiersza poleceń, co jest bardzo częstym przypadkiem. Zasadniczo nie należy zapisywać haseł i hostów w kodzie.
Przekazywanie właściwości systemu w wierszu poleceń za pomocą -D i ustawianie ich w kodzie za pomocą System.setProperty („nazwa”, „wartość”) jest równoważne.
ProxyUser i proxyPassword nie są właściwościami systemu Java, ale właściwościami klienta Apache HTTP, więc nie we wszystkich przypadkach.
THelper
8
odczytuje plik XML i musi pobrać jego schemat
Jeśli liczysz na pobieranie schematów lub DTD przez Internet, budujesz powolną, gadatliwą, delikatną aplikację. Co się stanie, gdy zdalny serwer hostujący plik zajmie planowane lub nieplanowane przestoje? Twoja aplikacja się psuje. Czy to w porządku?
Adresy URL schematów i tym podobne najlepiej traktować jako unikalne identyfikatory. Nie jako żądania zdalnego dostępu do tego pliku. Wyszukaj w Google „Katalog XML”. Katalog XML pozwala hostować takie zasoby lokalnie, co rozwiązuje powolność, spryt i kruchość.
Jest to zasadniczo trwale buforowana kopia zdalnej zawartości. I to jest w porządku, ponieważ zdalna zawartość nigdy się nie zmieni. Jeśli kiedykolwiek pojawi się aktualizacja, będzie ona dostępna pod innym adresem URL. Sprawienie, by faktyczne pobieranie zasobów przez Internet było szczególnie głupie.
Jest to niewielka aktualizacja, ale od wersji Java 7 połączenia proxy można teraz tworzyć programowo, a nie za pomocą właściwości systemu. Może to być przydatne, jeśli:
Serwer proxy musi być dynamicznie obracany podczas działania programu
Ostatnio odkryłem sposób, w jaki JVM może korzystać z ustawień proxy przeglądarki. Musisz dodać ${java.home}/lib/deploy.jardo projektu i zainicjować bibliotekę w następujący sposób:
import com.sun.deploy.net.proxy.DeployProxySelector;import com.sun.deploy.services.PlatformType;import com.sun.deploy.services.ServiceManager;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;publicabstractclassExtendedProxyManager{privatestaticfinalLog logger =LogFactory.getLog(ExtendedProxyManager.class);/**
* After calling this method, proxy settings can be magically retrieved from default browser settings.
*/publicstaticboolean init(){
logger.debug("Init started");// Initialization code was taken from com.sun.deploy.ClientContainer:ServiceManager.setService(System.getProperty("os.name").toLowerCase().indexOf("windows")!=-1?PlatformType.STANDALONE_TIGER_WIN32
:PlatformType.STANDALONE_TIGER_UNIX);try{// This will call ProxySelector.setDefault():DeployProxySelector.reset();}catch(Throwable throwable){
logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);returnfalse;}returntrue;}}
Następnie ustawienia proxy są dostępne dla Java API poprzez java.net.ProxySelector.
Jedynym problemem związanym z tym podejściem jest to, że musisz uruchomić JVM deploy.jarw ścieżce rozruchowej, np java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Jeśli ktoś wie, jak pokonać to ograniczenie, daj mi znać.
Chciałbym móc to wielokrotnie głosować, to jedyne rozwiązanie, które dla mnie zadziałało; Dziękuję Ci! Musiałem pobrać słoik rejestrujący apache commons stąd: commons.apache.org/proper/commons-logging/download_logging.cgi Mój kod w Main (): System.setProperty („java.net.useSystemProxies”, „true”) ; System.out.println („wykrywanie serwerów proxy”); ExtendedProxyManager.init ();
Boris
Co xbootclasspathwskazywałoby na wdrożenie deploy.jar, czy nie mogę przenieść tego słoika na moją normalną ścieżkę klasy (podczas uruchamiania bez uruchamiania sieci)?
Houtman
1
w JDK 9 nie udaje się :( Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Ta odpowiedź nie zawiera niczego, co nie zostało jeszcze powiedziane w innych odpowiedziach.
Simon Forsberg
1
Jak wskazano w innych odpowiedziach, jeśli chcesz używać uwierzytelnionych serwerów proxy, nie ma niezawodnego sposobu, aby to zrobić przy użyciu zmiennych wiersza polecenia - co jest denerwujące, jeśli używasz aplikacji innej osoby i nie chcesz zadzierać z kod źródłowy.
Na przykład w Proxifier możesz ustawić, aby przechwytywał tylko polecenia Java, którymi można zarządzać i przekierowywać przez (uwierzytelnione) proxy. Będziesz jednak chciał ustawić wartości proxyHost i proxyPort na puste w tym przypadku, np. Przekaż -Dhttp.proxyHost= -Dhttp.proxyPort=komendę java.
Możesz użyć zmiennych http.proxy * JVM, jeśli jesteś w autonomicznej JVM, ale NIE POWINIENEŚ modyfikować ich skryptów startowych i / lub robić tego na serwerze aplikacji (z wyjątkiem może jboss lub tomcat). Zamiast tego należy użyć interfejsu API serwera proxy JAVA (nie System.setProperty) lub własnych opcji konfiguracji dostawcy. Zarówno WebSphere, jak i WebLogic mają bardzo zdefiniowane sposoby konfigurowania serwerów proxy, które są znacznie potężniejsze niż J2SE. Ponadto w przypadku WebSphere i WebLogic prawdopodobnie zepsujesz serwer aplikacji w niewielki sposób, zastępując skrypty startowe (w szczególności procesy międzyoperacyjne serwera, ponieważ możesz im również powiedzieć, aby korzystali z twojego serwera proxy ...).
Odpowiedzi:
Z dokumentacji Java ( nie API javadoc):
http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
Ustaw flagi JVM
http.proxyHost
ihttp.proxyPort
podczas uruchamiania JVM w wierszu polecenia. Zwykle odbywa się to w skrypcie powłoki (w systemie Unix) lub w pliku bat (w systemie Windows). Oto przykład ze skryptem powłoki Uniksa:Podczas korzystania z kontenerów takich jak JBoss lub WebLogic, moim rozwiązaniem jest edycja skryptów startowych dostarczonych przez dostawcę.
Wielu programistów zna Java API (javadocs), ale wiele razy reszta dokumentacji jest pomijana. Zawiera wiele interesujących informacji: http://download.oracle.com/javase/6/docs/technotes/guides/
Aktualizacja: jeśli nie chcesz używać proxy do rozwiązania niektórych hostów lokalnych / intranetowych, sprawdź komentarz z @Tomalak:
źródło
http.nonProxyHosts
nieruchomości! (zastosowanie tak:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)http.proxyUser
ihttp.proxyPassword
nie są właściwościami systemu Java. Są dla klienta HTTP Apache.https.proxyHost
ihttps.proxyPort
dla HTTPs.Aby użyć systemowego ustawienia proxy:
Lub programowo:
Źródło: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
źródło
Aby programowo ustawić serwer proxy HTTP / HTTPS i / lub SOCKS:
Pamiętaj, że proxy HTTP i proxy SOCKS działają na różnych poziomach w stosie sieciowym, więc możesz użyć jednego lub drugiego lub obu.
źródło
Możesz ustawić te flagi programowo w ten sposób:
Wystarczy zwrócić odpowiednie wartości z metod
needsProxy()
,getProxyHost()
agetProxyPort()
można nazwać ten fragment kodu, kiedy tylko chcesz.źródło
JVM używa proxy do wykonywania połączeń HTTP
Może to korzystać z serwera proxy ustawień użytkownika
źródło
System.setProperty
zamiastSystem.getProperties().put(...)
Możesz ustawić niektóre właściwości dotyczące serwera proxy jako parametry jvm
-Dhttp.proxyPort = 8080, proxyHost itp.
ale jeśli potrzebujesz przekazać przez proxy uwierzytelniające, potrzebujesz uwierzytelnienia takiego jak ten przykład:
ProxyAuthenticator.java
Example.java
Na podstawie tej odpowiedzi: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E
źródło
Łączenie odpowiedzi Sortera i javabretta / Leonela:
źródło
Ustaw
java.net.useSystemProxies
właściwość natrue
. Możesz to ustawić na przykład za pomocą zmiennej środowiskowej JAVA_TOOL_OPTIONS . W Ubuntu możesz na przykład dodać następujący wiersz.bashrc
:źródło
Poniżej pokazano, jak ustawić w Javie proxy z użytkownikiem proxy i hasłem proxy z wiersza poleceń, co jest bardzo częstym przypadkiem. Zasadniczo nie należy zapisywać haseł i hostów w kodzie.
Przekazywanie właściwości systemu w wierszu poleceń za pomocą -D i ustawianie ich w kodzie za pomocą System.setProperty („nazwa”, „wartość”) jest równoważne.
Ale zauważ to
Przykład, który działa:
Ale następujące działania nie działają :
Jedyną różnicą jest położenie właściwości systemu! (przed i po zajęciach)
Jeśli masz hasło specjalne, możesz wpisać je w cudzysłowie „@ MyPass123%”, jak w powyższym przykładzie.
Jeśli masz dostęp do usługi HTTPS, trzeba użyć
https.proxyHost
,https.proxyPort
etc.Jeśli masz dostęp do usługi HTTP, trzeba użyć
http.proxyHost
,http.proxyPort
etc.źródło
Jeśli liczysz na pobieranie schematów lub DTD przez Internet, budujesz powolną, gadatliwą, delikatną aplikację. Co się stanie, gdy zdalny serwer hostujący plik zajmie planowane lub nieplanowane przestoje? Twoja aplikacja się psuje. Czy to w porządku?
Zobacz http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
Adresy URL schematów i tym podobne najlepiej traktować jako unikalne identyfikatory. Nie jako żądania zdalnego dostępu do tego pliku. Wyszukaj w Google „Katalog XML”. Katalog XML pozwala hostować takie zasoby lokalnie, co rozwiązuje powolność, spryt i kruchość.
Jest to zasadniczo trwale buforowana kopia zdalnej zawartości. I to jest w porządku, ponieważ zdalna zawartość nigdy się nie zmieni. Jeśli kiedykolwiek pojawi się aktualizacja, będzie ona dostępna pod innym adresem URL. Sprawienie, by faktyczne pobieranie zasobów przez Internet było szczególnie głupie.
źródło
Jestem również za firewallem, to zadziałało dla mnie !!
źródło
Jeśli chcesz użyć „Socks Proxy”, poinformuj o argumentach maszyny wirtualnej „socksProxyHost” i „socksProxyPort”.
na przykład
źródło
Dodaj to, zanim połączysz się z adresem URL za serwerem proxy.
źródło
http.proxyUser
ihttp.proxyPassword
nie są właściwościami systemu Java. Są dla klienta HTTP Apache.System.setProperty
zamiastSystem.getProperties().put(...)
Jest to niewielka aktualizacja, ale od wersji Java 7 połączenia proxy można teraz tworzyć programowo, a nie za pomocą właściwości systemu. Może to być przydatne, jeśli:
Oto wymyślony przykład w groovy:
Pełny opis: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
źródło
Ostatnio odkryłem sposób, w jaki JVM może korzystać z ustawień proxy przeglądarki. Musisz dodać
${java.home}/lib/deploy.jar
do projektu i zainicjować bibliotekę w następujący sposób:Następnie ustawienia proxy są dostępne dla Java API poprzez
java.net.ProxySelector
.Jedynym problemem związanym z tym podejściem jest to, że musisz uruchomić JVM
deploy.jar
w ścieżce rozruchowej, npjava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Jeśli ktoś wie, jak pokonać to ograniczenie, daj mi znać.źródło
xbootclasspath
wskazywałoby na wdrożenie deploy.jar, czy nie mogę przenieść tego słoika na moją normalną ścieżkę klasy (podczas uruchamiania bez uruchamiania sieci)?Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
To działa dla mnie:
P / S: Opieram się na odpowiedzi GHada.
źródło
Jak wskazano w innych odpowiedziach, jeśli chcesz używać uwierzytelnionych serwerów proxy, nie ma niezawodnego sposobu, aby to zrobić przy użyciu zmiennych wiersza polecenia - co jest denerwujące, jeśli używasz aplikacji innej osoby i nie chcesz zadzierać z kod źródłowy.
Czy Iverson przedstawia przydatne sugestie na temat korzystania z HttpProxy w celu połączenia się z hostem za pomocą wstępnego uwierzytelnienia w celu skorzystania z narzędzia do zarządzania proxy, takiego jak Proxifier ( http://www.proxifier.com/ dla Mac OS X i Windows).
Na przykład w Proxifier możesz ustawić, aby przechwytywał tylko polecenia Java, którymi można zarządzać i przekierowywać przez (uwierzytelnione) proxy. Będziesz jednak chciał ustawić wartości proxyHost i proxyPort na puste w tym przypadku, np. Przekaż
-Dhttp.proxyHost= -Dhttp.proxyPort=
komendę java.źródło
Możesz użyć zmiennych http.proxy * JVM, jeśli jesteś w autonomicznej JVM, ale NIE POWINIENEŚ modyfikować ich skryptów startowych i / lub robić tego na serwerze aplikacji (z wyjątkiem może jboss lub tomcat). Zamiast tego należy użyć interfejsu API serwera proxy JAVA (nie System.setProperty) lub własnych opcji konfiguracji dostawcy. Zarówno WebSphere, jak i WebLogic mają bardzo zdefiniowane sposoby konfigurowania serwerów proxy, które są znacznie potężniejsze niż J2SE. Ponadto w przypadku WebSphere i WebLogic prawdopodobnie zepsujesz serwer aplikacji w niewielki sposób, zastępując skrypty startowe (w szczególności procesy międzyoperacyjne serwera, ponieważ możesz im również powiedzieć, aby korzystali z twojego serwera proxy ...).
źródło
Myślę, że konfiguracja WINHTTP również będzie działać.
Wiele programów, w tym aktualizacje systemu Windows, ma problemy z serwerem proxy. Skonfigurowanie WINHTTP zawsze rozwiąże tego rodzaju problemy
źródło