[Gvsig_desarrolladores] Dependencia geoapi no encontrada

Cèsar Ordiñana cordinyana en gvsig.com
Mar Abr 12 18:47:40 CEST 2011


Hola,

El 12/04/11 16:50, Fernando González escribió:
> Bueno, pues ya tengo lo que quería. El código[1] lee un DXF itera por
> todos los vértices de todas las geometrías y construye un gran
> multipunto con todos ellos, que era lo que quería. Seguro que no es la
> manera más ortodoxa (tengo un warning por deprecated) pero funciona,
> vaya. El código lo meto en un proyecto maven al que modifico el pom
> para que se parezca a esto[2].
>
> Quiero aprovechar para reconocer el gran trabajo que hay en el tema de
> organizar el build. Poner orden ahí ha tenido que ser brutal.

Gracias Fernando, la verdad es que si, ha sido un esfuerzo ingente el 
que se ha hecho, pero creo que ha valido la pena.

> Me
> cuesta entender el hecho de que tenga que incluir
> org.gvsig:org.gvsig.symbology:impl y org.gvsig:org.gvsig.symbology. Si
> no he entendido mal, este último es la API mientras que el primero es
> la implementación de dicha API. ¿No debería incluirse la dependencia
> de forma transitiva? Es posible que me esté confundiendo con el tema
> de los clasificadores, que no he utilizado nunca, pero si la
> implementación fuera un proyecto que dependiera de la API, sólo sería
> necesario incluir las distintas implementaciones (las APIs se
> incluirían de forma transitiva), ¿no?

Si, con un proyecto con estructura maven como toca si. El problema es 
que tenemos proyectos con la estructura antigua aún, con el código del 
API e implementación juntos, que simplemente se separan al generar jars. 
Con esto no hay dependencia entre ellos, y sólo se distinguen mediante 
classifiers.

Precisamente ese proyecto ha sido adaptado a una estructura multimódulo 
de maven [1], por lo que puedes empezar a usar las nuevas dependencias 
(org.gvsig.symbology.lib.api, org.gvsig.symbology.lib.impl, etc.). En 
este caso si que tendrás la dependencia transitiva entre impl y api.

De todas formas, es una buena práctica en maven indicar todas las 
dependencias de compilación que tenga un proyecto, aunque algunas las 
puedas tener de forma transitiva. Ej: proyecto A depende para compilar 
de proyecto B y de C, mientras que B depende para compilar de C. Con 
esto, bastaría con incluir en A la dependencia con B, pero si más 
adelante B quita su dependencia con C, A ya no compilaría.

Otra buena práctica también consiste en no poner como dependencias de 
compilación (valor por defecto) aquellas que sólo se necesiten en 
ejecución o test, mediante el uso el tag <scope>runtime/test</scope>. 
Esto también te obligaría a poner las dependencias de compilación con el 
API, aunque tengas la dependencia con la implementación para ejecución o 
test.

> No sé si me estoy rallando (si es así decírmelo sin problemas), pero
> supongo que el objetivo de tener API e implementaciones por separado
> es que se pueda cambiar de implementación fácilmente. Me parece muy
> interesante, pero para que esto sea fácil de usar se podrían poner
> algunos poms de ejemplos con las combinaciones de implementaciones más
> fácilmente utilizadas. Mientras escribo, se me ocurre que esto tiene
> que ver con el tema del org.gvsig.core.maven.dependencies que
> comentaba César, pero que yo no he entendido muy bien. Más adelante le
> echaré un vistazo a eso a ver.

Si, justo el org.gvsig.core.maven.dependencies es para eso que comentas. 
Si te animas a mirarlo y te surge alguna duda coméntalo a ver si te 
puedo echar una mano. Mi propuesta aplicando eso y mis comentarios 
anteriores a tu pom sería:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.test</groupId>
<artifactId>dxftest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>dxftest</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>gvsig</id>
<name>Repositorio gvSIG</name>
<url>
                 
http://gvsig-desktop.forge.osor.eu/downloads/pub/projects/gvSIG-desktop/maven-repository/
</url>
</repository>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation</name>
<url>http://download2.osgeo.org/webdav/geotools</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

<dependencyManagement>
<!-- Con esto ya no hace falta especificar las versiones de dependencias 
gvSIG -->
<dependencies>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.core.maven.dependencies</artifactId>
<version>2.0.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.tools.lib</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.metadata.lib.basic.api</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.fmap.dal</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.fmap.dal</artifactId>
<classifier>spi</classifier>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.fmap.dal.file</artifactId>
<classifier>store.dxf</classifier>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.fmap.geometry</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.projection</artifactId>
<scope>compile</scope>
</dependency>
<!-- Dejamos arriba sólo dependencias de compilación, añadiendo esta de 
ejecución
                 que nos incluirá a su vez todas las dependencias 
(impls, spis, proveedores, etc.)
                 necesarias en ejecución. -->
<dependency>
<groupId>org.gvsig</groupId>
<artifactId>org.gvsig.core.maven.dependencies</artifactId>
<version>2.0.1-SNAPSHOT</version>
<type>pom</type>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

> Bueno, gracias por la ayuda y por el trabajo. Un saludo.

Gracias a ti por los comentarios Fernando, nos viene de perlas que se 
vayan probando estas cosas para ir puliendo el sistema. Aunque queda un 
poco largo el email, aprovecho para proponerte otra implementación 
alternativa del ejemplo que adjuntas, pero empleando Visitor con lo que 
se simplifica un poco:

     public static void main(String[] args) throws Exception {
         new DefaultLibrariesInitializer().fullInitialize();
         DataManager manager = DALLocator.getDataManager();
         DXFStoreParameters params =
             (DXFStoreParameters) manager
                 .createStoreParameters(DXFStoreProvider.NAME);
         params
             .setFile("/home/fergonco/b/projects/geoweb/dxf/ejemplo7.dxf");
         params.setCRS("EPSG:23030");

         FeatureStore store =
             (FeatureStore) manager.openStore(DXFStoreProvider.NAME, 
params);

         GeometryFactory jtsGeometryFactory = new GeometryFactory();
         final HashSet<Coordinate> points = new HashSet<Coordinate>();
         store.accept(new Visitor() {
             public void visit(Object obj) throws 
VisitCanceledException, BaseException {
                 Feature feature = (Feature) obj;
                 Geometry geom = feature.getDefaultGeometry();
                 PathIterator gp = geom.getPathIterator(null);
                 double[] coords = new double[6];
                 while (!gp.isDone()) {
                     gp.currentSegment(coords);
                     points.add(new Coordinate(coords[0], coords[1]));
                     gp.next();
                 }
             }
         });

         System.out.println(jtsGeometryFactory.createMultiPoint(points
             .toArray(new Coordinate[0])));
         store.dispose();
     }

[1] 
https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/libraries/org.gvsig.symbology

Saludos,

-- 
Cèsar Ordiñana Navarro
gvSIG software architect
DiSiD Technologies (http://www.disid.com)



> [1]
> 	public static void main(String[] args) throws Exception {
> 		new DefaultLibrariesInitializer().fullInitialize();
> 		DataManager manager = DALLocator.getDataManager();
> 		DXFStoreParameters params = (DXFStoreParameters) manager
> 				.createStoreParameters(DXFStoreProvider.NAME);
> 		params.setFile("/home/fergonco/b/projects/geoweb/dxf/ejemplo7.dxf");
> 		params.setCRS("EPSG:23030");
>
> 		FeatureStore store = (FeatureStore) manager.createStore(params);
> 		FeatureSet features = store.getFeatureSet();
>
> 		DisposableIterator it = features.iterator();
> 		GeometryFactory jtsGeometryFactory = new GeometryFactory();
> 		HashSet<Coordinate>  points = new HashSet<Coordinate>();
> 		while (it.hasNext()) {
> 			Feature feature = (Feature) it.next();
> 			Geometry geom = feature.getDefaultGeometry();
> 			PathIterator gp = geom.getPathIterator(null);
> 			double[] coords = new double[6];
> 			while (!gp.isDone()) {
> 				gp.currentSegment(coords);
> 				points.add(new Coordinate(coords[0], coords[1]));
> 				gp.next();
> 			}
> 		}
> 		System.out.println(jtsGeometryFactory.createMultiPoint(points
> 				.toArray(new Coordinate[0])));
> 		it.dispose();
> 		features.dispose();
> 		store.dispose();
> 	}
>
> [2]
>
> <project xmlns="http://maven.apache.org/POM/4.0.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd">
> 	<modelVersion>4.0.0</modelVersion>
>
> 	<groupId>org.test</groupId>
> 	<artifactId>dxftest</artifactId>
> 	<version>1.0-SNAPSHOT</version>
> 	<packaging>jar</packaging>
>
> 	<name>dxftest</name>
> 	<url>http://maven.apache.org</url>
>
> 	<properties>
> 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
> 	</properties>
> 	<repositories>
> 		<repository>
> 			<id>gvsig</id>
> 			<name>Repositorio gvSIG</name>
> 			<url>
> 				http://gvsig-desktop.forge.osor.eu/downloads/pub/projects/gvSIG-desktop/maven-repository/
> 			</url>
> 		</repository>
> 		<repository>
> 			<id>osgeo</id>
> 			<name>Open Source Geospatial Foundation</name>
> 			<url>http://download2.osgeo.org/webdav/geotools</url>
> 			<releases>
> 				<enabled>true</enabled>
> 				<updatePolicy>never</updatePolicy>
> 				<checksumPolicy>warn</checksumPolicy>
> 			</releases>
> 			<snapshots>
> 				<enabled>false</enabled>
> 			</snapshots>
> 		</repository>
> 	</repositories>
>
> 	<dependencies>
> 		<dependency>
> 			<groupId>junit</groupId>
> 			<artifactId>junit</artifactId>
> 			<version>3.8.1</version>
> 			<scope>test</scope>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.compat</artifactId>
> 			<classifier>se</classifier>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.symbology</artifactId>
> 			<classifier>impl</classifier>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.symbology</artifactId>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.fmap.dal.file</artifactId>
> 			<classifier>store.dxf</classifier>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.fmap.dal.file</artifactId>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.fmap.geometry</artifactId>
> 			<classifier>impl</classifier>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 		<dependency>
> 			<groupId>org.gvsig</groupId>
> 			<artifactId>org.gvsig.projection</artifactId>
> 			<classifier>cresques-impl</classifier>
> 			<version>2.0-SNAPSHOT</version>
> 		</dependency>
> 	</dependencies>
> 	<build>
> 		<plugins>
> 			<plugin>
> 				<groupId>org.apache.maven.plugins</groupId>
> 				<artifactId>maven-eclipse-plugin</artifactId>
> 				<configuration>
> 					<downloadSources>true</downloadSources>
> 					<downloadJavadocs>true</downloadJavadocs>
> 				</configuration>
> 			</plugin>
> 		</plugins>
> 	</build>
> </project>


Más información sobre la lista de distribución gvSIG_desarrolladores