Maven + Surefire: proxy configuration
Asked Answered
C

3

10

I'm using httpunit to access a server.

I need to configure the proxy settings for this (http and https).

I set the configuration in the settings.xml file, but surefire seems to ignore it!?

I want to avoid to duplicate the configuration as much as possible.

In the surefire plugin configuration I tried:

<systemPropertyVariables>
    <http.proxyHost>${http.proxyHost}</http.proxyHost>
</systemPropertyVariables>

and

<argLine>-Dhttp.proxyHost=${http.proxyHost}</argLine>

and

<argLine>-Dhttp.proxyHost=${settings.proxies[protocol=http].host}</argLine>

and several other combinations.

I print the system properties in the unit test with:

for (String propertyName : new TreeSet<String>(System.getProperties().stringPropertyNames())){
        System.out.println(propertyName + ": " + System.getProperty(propertyName));
    }

The only thing which worked so far are explicit values such as:

<systemPropertyVariables>
    <http.proxyHost>myProxy</http.proxyHost>
</systemPropertyVariables>

or

<argLine>-Dhttp.proxyHost=myProxy</argLine>

But as I said, I don't want to duplicate the configuration, if possible.

How can I use the proxy settings set in the settings.xml file in unit tests?

Councilwoman answered 24/11, 2011 at 18:12 Comment(1)
How about having http.proxyHost as a property in settings.xml? I guess currently you are trying to use proxy settings value.Defendant
A
3

I solved that by providing all proxy-related settings to Maven via system properties when needed, plus some tweaks to detect in runtime if those settings present in my parent POM.

1) In environments where proxy settings are required, create RC file for Maven ("~/.mavenrc" or "%PROFILE%\mavenrc_pre.bat") with MAVEN_OPTS inside. For example:

set MAVEN_OPTS=-Dhttp.proxyHost=10.0.1.250 -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts="localhost|*.local|*.mylab.com"

2) Detect if proxy settings were provided and build arguments for Surefire:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>groovy-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>execute</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <source>
            <![CDATA[
                // Collect proxy settings to use in Surefire and Failsafe plugins
                def settings = "";
                System.properties.each { k,v ->
                    if ( k.startsWith("http.") || k.startsWith("https.") )
                    {
                        // We have to escape pipe char in 'nonProxyHosts' on Windows
                        if (System.properties['os.name'].toLowerCase().contains('windows'))
                            v = v.replaceAll( "\\|", "^|" );
                        settings += "-D$k=$v ";
                    }
                }
                project.properties["proxy.settings"] = settings;
            ]]>
        </source>
    </configuration>
</plugin>

3) Use prepared arguments in Surefire and Failsafe plugins:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <argLine>${proxy.settings}</argLine>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <argLine>${proxy.settings}</argLine>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
    </configuration>
</plugin>

Enjoy :)

Ambit answered 30/8, 2015 at 9:4 Comment(0)
B
1

Maven Surefire plugin's forkMode defaults to "once". I would suggest setting this to "never" and then trying to run the build again. My theory here is that you are losing the system property because the Surefire plugin is forking a new JVM.

Baryram answered 26/12, 2012 at 18:59 Comment(1)
Surefire "looses" system properties on purpose - it pretends to provide you with the clean environment for your tests.Ambit
T
0

Editing Maven's settings.xml file to add the proxy worked properly for me. In Ubuntu and AWS Linux the path is /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven/conf

<!-- proxy
 | Specification for one proxy, to be used in connecting to the network.
 |
<proxy>
  <id>optional</id>
  <active>true</active>
  <protocol>http</protocol>
  <username>proxyuser</username>
  <password>proxypass</password>
  <host>proxy.host.net</host>
  <port>80</port>
  <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
Transistor answered 7/10, 2014 at 20:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.