3

我想创建一个可以显示 .shp(形状文件)并编辑该形状文件的属性表的 java 桌面应用程序。我在 geotools 网站上关注这个快速入门教程来学习在应用程序中显示形状文件的部分。我在教程中成功创建了应用程序,我可以在其中显示一个形状文件。

现在我想在我已经用几个其他函数创建的 java swing 应用程序中做同样的事情。我有一个 JFrame,我想在其中显示地图(形状文件)。我将 maven 项目中的代码和所有必需的库复制到了 java swing 项目,但它给了我这个错误。

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/vividsolutions/jts/geom/Geometry

我认为如果没有 maven 项目中的 pom.xml 文件,就无法运行复制的代码。

我将其称为“maven 应用程序”或“maven 项目”可能是错误的。我对 Maven 知之甚少,但对 Java SE 有相当好的了解。

我只想在 java swing 应用程序中显示地图,就像我在 maven 应用程序中所做的那样。

谁可以帮我这个事?

谢谢你!

4

1 回答 1

3

Maven 是一个处理项目依赖关系的程序(它有很多东西,但这是它与您最相关的特性)。

在您的情况下,Maven 知道您的项目需要gt-shapefile工件(Maven 对 jar 和类似 jar 的东西的术语),因为您已经告诉过它。但是 Maven 会查找pom.xml文件gt-shapefile并得知它还需要gt-data,gt-referencingjdom. 然后它会查看它们每个的 POM并发现更多的依赖关系,直到它收集完整的集合。

一旦 Maven 确定了您需要的所有库,它就可以执行构建(通过这种方式,它就像 Ant 或您的 IDE,运行 Java 编译器)。一旦代码被编译(或打包,如果你有 Maven 制作一个 jar),Maven 就完成了,与完成的产品无关。

Swing 是一个标准的图形库。如果您正在编写使用它的类的代码,那么这是一个编译时依赖关系,并且当您稍后运行该代码时,Java 将需要找到与 Swing 类的链接。

所以对于术语:您可以使用 Maven 或 Ant 或 NetBeans(它是 Ant 上的一个层)或 Eclipse来描述一个项目。您可以使用这些项目构建工具中的任何一个来编译使用 Swing 类的代码。事实上,由于代码 Swing 类是标准库的一部分,因此您根本不需要提及任何 jar 来使用 Swing。


好的,现在你的实际问题。

您的一种选择是仅使用 Maven。通过将现有应用程序的文件复制到 Maven 样式结构中,将其转换为 Maven 项目。有一个关于将Maven 与 NetBeans 结合使用的页面可能会有所帮助。基本上,应用程序的 Java 源代码在src/main/java(包名目录从那里开始),非代码的东西(如图像文件)进入src/main/resources,与单元测试相关的东西进入src/test/javasrc/test/resources. 如果您的应用程序很简单,这应该不会太难,并且您会发现 Maven 使用起来很方便。

如果您的项目很复杂,或者与不使用 Maven 的人共享,或者您只是不想要它,那么您应该弄清楚您需要哪些依赖项。对于这些说明,我假设您已经安装了 Maven 并且在 Unix shell 中。

转到基于 Maven 的 Geotools 项目的根目录(包含它的目录pom.xml)。您可以使用命令复制所有依赖项

mvn dependency:copy-dependencies -DoutputDirectory=jars

这将创建一个名为“jars”的子目录,其中包含构建项目所需的每个 jar(包括传递依赖项)。现在只需将这些 jar 链接到您现有的应用程序(或验证它们是否已链接)。

如果你好奇,你可以跑

mvn dependency:tree

并且 Maven 会以文本形式为您打印依赖关系树,因此您可以了解为什么需要每个 jar。

于 2013-06-08T17:16:07.193 回答