Статьи

Maven упрощает повторное использование компонентов платформы NetBeans в простых приложениях


Вам когда-нибудь нужно было повторно использовать компонент, написанный для платформы NetBeans, в простом приложении Java?
Это случалось со мной пару раз в прошлом — не так уж и сложно, но немного раздражало необходимость управлять дублированными артефактами, то есть файлом .jar, используемым простым приложением для каждого .nbm, созданного для приложений на платформе.

С Maven раздражение полностью исчезло, потому что проект платформы Maven создает и развертывает оба типа артефактов (jar и nbm).

В этом 30-секундном руководстве (за исключением времени, необходимого для загрузки артефактов из сети) мы узнаем, как использовать два компонента из forceTen в простом простом Java-приложении.

Сначала скопируйте следующий XML-файл в файл pom.xml в вашем рабочем каталоге:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>it.tidalwave.geo.examples</groupId>
<artifactId>example2</artifactId>
<version>1.0-SNAPSHOT</version>
<name>forceTen Example2 (master)</name>
<url>http://maven.apache.org</url>

<repositories>
<repository>
<id>netbeans</id>
<name>NetBeans Platform Maven Repository</name>
<url>http://bits.netbeans.org/maven2/</url>
</repository>
<repository>
<id>maven2-release-repository.nbpwr.kenai.com</id>
<name>NBPWR Maven Release Repository</name>
<url>https://kenai.com/website/nbpwr/maven-repository/releases</url>
</repository>
<repository>
<id>maven2-release-repository.openbluesky.kenai.com</id>
<name>OpenBlueSky Maven Release Repository</name>
<url>https://kenai.com/website/openbluesky/maven-repository/releases</url>
</repository>
<repository>
<id>maven2-release-repository.forceten.kenai.com</id>
<name>forceTen Maven Release Repository</name>
<url>https://kenai.com/website/forceten/maven-repository/releases</url>
</repository>
</repositories>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>it.tidalwave.geo</groupId>
<artifactId>it-tidalwave-geo-geocoding</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>it.tidalwave.geo</groupId>
<artifactId>it-tidalwave-geo-geocoding-geonamesprovider</artifactId>
<version>1.0.44</version>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>it.tidalwave.geo</groupId>
<artifactId>it-tidalwave-geo-geocoding</artifactId>
</dependency>
<dependency>
<groupId>it.tidalwave.geo</groupId>
<artifactId>it-tidalwave-geo-geocoding-geonamesprovider</artifactId>
</dependency>
</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

Обратите внимание, что, за исключением репозиториев, в NetBeans ничего нет; это просто простой pom, где я заявляю, что хочу использовать два артефакта (API GeoCoding и поставщик услуг для него).  

Теперь скопируйте следующий код Java в файл с именем Main.java в подкаталоге src / main / java вашего текущего пути:

import javax.annotation.Nonnull;
import it.tidalwave.netbeans.util.Finder;
import it.tidalwave.netbeans.util.Locator;
import it.tidalwave.netbeans.util.NotFoundException;
import it.tidalwave.geo.Coordinate;
import it.tidalwave.geo.geocoding.GeoCoder;
import it.tidalwave.geo.geocoding.GeoCoderEntity;
import it.tidalwave.geo.geocoding.GeoCoderEntity.FactSheet;
import static it.tidalwave.netbeans.util.Displayable.Displayable;
import static it.tidalwave.geo.geocoding.GeoCoder.GeoCoder;
import static it.tidalwave.geo.geocoding.GeoCoderEntity.FactSheet.*;
import static it.tidalwave.geo.geocoding.GeoCoderEntity.FactSheet.FactSheet;

public class Main
{
public static void main (final @Nonnull String ... args)
throws NotFoundException
{
final GeoCoder geoCoder = Locator.find(GeoCoder);
final Coordinate coordinate = new Coordinate(43.5, 6);
final Finder<GeoCoderEntity> nearbyPlaces = geoCoder.findNearByEntities(coordinate, 10);

for (final GeoCoderEntity place : nearbyPlaces.results())
{
final String displayName = place.as(Displayable).getDisplayName();
final String type = place.getTypeAsString();
final Coordinate c = place.getCoordinate();
final FactSheet factSheet = place.as(FactSheet);

System.err.printf("%-30s %-5s: %s\n", displayName, type, c);

if (factSheet.contains(POPULATION))
{
System.err.printf("%42s %d\n", "population:", factSheet.get(POPULATION));
}

if (factSheet.contains(ELEVATION))
{
System.err.printf("%42s %d\n", "elevation: ", factSheet.get(ELEVATION));
}
}
}
}

Теперь запустите:

mvn clean install exec:java -Dexec.mainClass=Main

Вы должны увидеть этот вывод приложения:

Châteauvert                    PPL  : N 43° 30' 00.000" E 6° 01' 00.000", 0.0
population: 147
elevation: 0
Miraval PPL : N 43° 28' 00.000" E 6° 02' 00.000", 0.0
elevation: 0
Saint-Estève PPL : N 43° 30' 00.000" E 5° 56' 00.000", 0.0
elevation: 0
Brue-Auriac PPL : N 43° 32' 00.000" E 5° 57' 00.000", 0.0
population: 959
elevation: 0
Bras PPL : N 43° 28' 00.000" E 5° 57' 00.000", 0.0
population: 1888
elevation: 0
Barjols PPL : N 43° 33' 00.000" E 6° 00' 00.000", 0.0
population: 2619
elevation: 0
Correns PPL : N 43° 29' 00.000" E 6° 05' 00.000", 0.0
population: 723
elevation: 0
Pontevès PPL : N 43° 34' 00.000" E 6° 03' 00.000", 0.0
population: 624
elevation: 0
Seillons-Source-d'Argens PPL : N 43° 29' 00.000" E 5° 53' 00.000", 0.0
elevation: 0

Что вы вносите в свое приложение? Вы можете обнаружить это, сгенерировав дерево зависимостей с помощью:

mvn dependency:tree 

Выход:

[INFO] [dependency:tree {execution: default-cli}]
[INFO] it.tidalwave.geo.examples:example2:jar:1.1-SNAPSHOT
[INFO] +- it.tidalwave.geo:it-tidalwave-geo-geocoding:jar:3.1.0:compile
[INFO] |  +- it.tidalwave.netbeans:it-tidalwave-netbeans-util:jar:1.10.20:compile
[INFO] |  |  \- com.kenai.nbpwr:javax-inject:jar:1.0:compile
[INFO] |  |     \- javax.inject:javax.inject:jar:1:compile
[INFO] |  +- it.tidalwave.geo:it-tidalwave-geo:jar:2.0.32:compile
[INFO] |  +- org.netbeans.api:org-openide-util:jar:RELEASE68:compile
[INFO] |  +- it.tidalwave.netbeans:it-tidalwave-netbeans-capabilitiesprovider:jar:1.1.8:compile
[INFO] |  +- com.kenai.nbpwr:edu-umd-cs-findbugs-annotations:jar:1.3.2.3:compile
[INFO] |  |  \- net.sourceforge.findbugs:annotations:jar:1.3.2:compile
[INFO] |  \- com.kenai.nbpwr:javax-annotation:jar:1.3.7.3:compile
[INFO] |     \- com.google.code.findbugs:jsr305:jar:1.3.7:compile
[INFO] \- it.tidalwave.geo:it-tidalwave-geo-geocoding-geonamesprovider:jar:1.0.44:compile
[INFO]    +- it.tidalwave.netbeans:it-tidalwave-netbeans-workspacemanager:jar:2.2.16:compile
[INFO]    +- it.tidalwave.thesefoolishthings:it-tidalwave-util-logging:jar:1.0.5:compile
[INFO]    |  \- it.tidalwave.thesefoolishthings:it.tidalwave.util.logging:jar:1.0.5:compile
[INFO]    \- com.kenai.nbpwr:org-apache-commons-io:jar:1.3.1.4:compile
[INFO]       \- commons-io:commons-io:jar:1.3.1:compile

поэтому есть только несколько библиотек, используемых forceTen, и один модуль из платформы NetBeans, org-openide-util, который содержит Lookup. В этом случае проблем нет, так как он будет работать в простом приложении. В других случаях могут потребоваться некоторые более сложные компоненты Платформы, и не обязательно будет просто заставить их работать «из коробки».

Также обратите внимание, что механизм обнаружения служб, основанный на средстве META-INF / services, работает нормально, поскольку это стандартная функция Java 6: фактически вы используете абстрактный API геокодирования, а в коде нет ссылки на провайдер GeoNames; Тем не менее, он обнаружен во время выполнения.