java maven. Как вынести файл ресурса из jar файла

Что бы сделать файл property или конфиг внешним, а не в jar файле с помощью maven, нужно два действия:

  1. Указать мавену скопировать файлы из папки ресурсов в нужную папку
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-resources</id>
                <phase>process-resources</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/resources</directory>
                            <excludes>
                                <exclude>*.properties</exclude>
                            </excludes>
                       </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    В данном примере копируются все файлы из «src/main/resources», кроме файлов с расширением property, в папку сборки приложения

  2. Указать мавену исключить нужный файл из ресурсов при сборке
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>*.xml</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>
    В данном примере все xml файлы из «src/main/resources» не включаются в сборку

Java maven. Как добавить внешний файл в POM на примере jpcap

Если в POM нужно добавить внешний файл, которого нет в репозитории, можно сделать это так:

  1. Установить файл в репозиторий из командной строки, ниже пример как сделать это для 2-х файлов программы jpcap
    C:\> mvn install:install-file -Dfile=C:\jpcap.jar -DgroupId=com.jpcap -DartifactId=jpcap -Dversion=0.6 -Dpackaging=jar
    C:\> mvn install:install-file -Dfile=C:\jpcap.dll -DgroupId=com.jpcap -DartifactId=jpcap -Dversion=0.6 -Dpackaging=dll
  2. Создать в проекте папку с названием local-repo и в этой папке создать папку com
  3. Скопировать папку jpcap из «C:\Users\qaskilluser\.m2\repository\com» в «local-repo\com». Таким образом мы создали локальный репозиторий. Должно получиться примерно вот так:local repo
  4. More >

Java maven. Как подключить Native Library на примере jpcap

Чтобы подключить к примеру .dll бибилиотеку которую использует .jar файл к maven проекту можно написать два плагина. Первый будет копировать нужный .dll файл в каталог скомпилированого приложения, второй плагин пропишет путь к этой библиотеке в java.library.path переменную. Ниже пример плагинов для для jpcap библиотеки где jpcap.jar использует jpcap.dll. Если дллку не подключить то будет java.lang.UnsatisfiedLinkError: no jnotify in java.library.path

<!-- Copy required dll to project build directory -->
<plugin>
   <groupid>org.apache.maven.plugins</groupid>
   <artifactid>maven-dependency-plugin</artifactid>
   <executions>
        <execution>
            <id>copy</id>
            <phase>compile</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactitems>
                    <artifactitem>
                        <groupid>com.jpcap</groupid>
                        <artifactid>jpcap</artifactid>
                        <version>0.6</version>
                        <type>dll</type>
                        <overwrite>true</overwrite>
                        <outputdirectory>${project.build.directory}/lib</outputdirectory>
                        <destfilename>jpcap.dll</destfilename>
                    </artifactitem>
                </artifactitems>
            </configuration>
        </execution>
</executions>
</plugin>

More >

И маленькая щепоточка.... :)

Selenium WebDriver. Как подключить Modify Header плагин, на примере X-IP header

Что бы протестировать доступ к веб приложению из разных стран с помощью селениума, можно подключить Modify Header плагин и подменять X-IP header в запросе, если приложение его поддерживает. Ниже описано как настроить селениум и плагин:

  1. Скачать Modify Header плагин отдельно от Firefox и поместить его например в папку src/test/resources;
  2. Написать java код который подключит и настроит плагин к Firefox пофайлу и запустит браузер с указанными настройками:
public void openFirefoxWithModifyHeader(String ipAddress) throws IOException {
	logger.info("Initialize Modify Header plugin with IP: " + ipAddress);
	File file = new File("src/test/resources/modify_headers-0.7.0.2.xpi");
	FirefoxProfile profile = new FirefoxProfile();
	profile.addExtension(file);
	profile.setPreference("modifyheaders.config.active", true);
	profile.setPreference("modifyheaders.config.alwaysOn", true);
	profile.setPreference("modifyheaders.headers.count", 1);
	profile.setPreference("modifyheaders.headers.action0", "Add");
	profile.setPreference("modifyheaders.headers.name0", "X-IP");
	profile.setPreference("modifyheaders.headers.value0", ipAddress);
	profile.setPreference("modifyheaders.headers.enabled0", true);
	logger.info("Open Firefox instance");
	WebDriver driver = new FirefoxDriver(profile);
	driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

XPath. Пример following-sibling, Parent, preceding-sibling

following-sibling(Аналог Next Sibling):
//label[.='Odds']/following-sibling::div//span

xpath Following Sibling

More >

Java. Как вернуть значение найденое с Regex

Regex в java немного отличается от регекса в .net. Чтобы найти соответствие в строке нужно для матчера сначала выполнить метод mather.find() и только затем можно просматривать, что он нашел и вернуть нужное значение. Но для этого возвращаемое значение нужно выделить в группу с помощью круглых скобок. Ниже пример, который вытаскивает из времени часы и минуты.

public int getMinutesFromTime(String timeFullString) {
	String REGEX = ":([0-9]+)";
	String INPUT = timeFullString;
	Pattern pattern;
	Matcher matcher;
 
	pattern = Pattern.compile(REGEX);
	matcher = pattern.matcher(INPUT);
	if (matcher.find())
		return Integer.parseInt(matcher.group(1));
	return 0;
}
 
public int getHoursFromTime(String timeFullString) {
	String REGEX = "([0-9]+):";
	String INPUT = timeFullString;
	Pattern pattern;
	Matcher matcher;
 
	pattern = Pattern.compile(REGEX);
	matcher = pattern.matcher(INPUT);
	matcher.find();
	return Integer.parseInt(matcher.group(1));
}

Java. Как сделать Enum который подставляет строку вместо ключа

Если нужно сделать enum из статических значений и подставлять их например в тест использую только ключ и не объявлять всяких switch, if else, можно воспользоваться таким способом

public enum CurrencySymbols {
	GBP("\u00A3"), 
	USD("\u0024"), 
	EURO("\u20AC"),
	AUD("AUD");
	String currencySymbol;
 
	CurrencySymbols(String currencySymbol){
		this.currencySymbol = currencySymbol;
	}
 
	public String getCurrencySymbol(){
		return this.currencySymbol;
	}
 
	@Override 
	public String toString() {
	    return getCurrencySymbol();
	}
}

Теперь с этим можно работать вот так:

String s = "The currency is: " + CurrencyUsers.GBP;

Результатом будет

The currency is: £

Найди баг и пройди игру

Игру можно пройти только найдя в ней баг. Я прошел :)

Нагрузочное тестирование мамы

С целью определить какую максимальную нагрузку выдерживает мама :)