java.lang.NoClassDefFoundError:无法初始化类javax.media.jai.JAI

我最近用GeoTools开始了我的第一个程序,其中我也使用JAI-Java Advanced Imaging 1_1_2_01和JDK 1_7。 它工作正常,直到我添加了GeoTiff Jars 。 我发现以下错误

线程“main”中的exceptionjava.lang.NoClassDefFoundError:无法在com.rgb.PixelExtractor.extract的org.geotools.gce.geotiff.GeoTiffReader.read(GeoTiffReader.java:607)初始化类javax.media.jai.JAI (PixelExtractor.java:55)at com.rgb.RGBSpliter.main(RGBSpliter.java:136)

守则如下

public void extract(File f, String name, String date) throws Exception { ParameterValue policy = AbstractGridFormat.OVERVIEW_POLICY .createValue(); policy.setValue(OverviewPolicy.IGNORE); // this will basically read 4 tiles worth of data at once from the disk... ParameterValue gridsize = AbstractGridFormat.SUGGESTED_TILE_SIZE.createValue(); //gridsize.setValue(512 * 4 + "," + 512); // Setting read type: use JAI ImageRead (true) or ImageReaders read methods (false) ParameterValue useJaiRead = AbstractGridFormat.USE_JAI_IMAGEREAD.createValue(); useJaiRead.setValue(true); //reader.read(new GeneralParameterValue[] { policy, gridsize, useJaiRead }); // The line that throws error GridCoverage2D image = new GeoTiffReader(f).read(new GeneralParameterValue[]{policy, gridsize, useJaiRead}); Rectangle2D bounds2D = image.getEnvelope2D().getBounds2D(); bounds2D.getCenterX(); // calculate zoom level for the image GridGeometry2D geometry = image.getGridGeometry(); BufferedImage img = ImageIO.read(f); // ColorModel colorModel = img.getColorModel( WritableRaster raster = img.getRaster(); int numBands = raster.getNumBands(); int w = img.getWidth(); int h = img.getHeight(); outer: for (int i = 0; i < w; i++) {//width... for (int j = 0; j < h; j++) { double[] latlon = geo(geometry, i, j); double lat = latlon[0]; double lon = latlon[1]; Double s = 0d; String originalBands = ""; for (int k = 0; k < numBands; k++) { double d = raster.getSampleDouble(i, j, k); originalBands += d + ","; s += d; } originalBands = originalBands.substring(0, originalBands.length() - 1); if (s.compareTo(0d) == 0) { continue; } String geoHash = GeohashUtils.encodeLatLon(lat, lon); //here do something with the bands, lat, long, geohash, etc.... } } } private static double[] geo(GridGeometry2D geometry, int x, int y) throws Exception { //int zoomlevel = 1; Envelope2D pixelEnvelop = geometry.gridToWorld(new GridEnvelope2D(x, y, 1, 1)); // pixelEnvelop.getCoordinateReferenceSystem().getName().getCodeSpace(); return new double[]{pixelEnvelop.getCenterY(), pixelEnvelop.getCenterX()}; } } 

JDK Jars

JDK图像jar

其他jar子

第1部分

第2部分

我还为GeoTools jar添加了classpath变量

类路径

编辑:

我的jai在没有GeoTools Integration的情况下工作,但是当我添加gt-geotiff-14.4.jar它尝试添加JAI-core-1.1.3.jar ,这与我的JDK 1.7中的jai-core.jar冲突。 所以我删除了JAI-core-1.1.3.jar和相关的jar,但它仍然给我同样的错误。

最后,当我删除Geotiff jai-core-1.1.3.jarjai-codec-1.1.3.jarjai-imageio-1.1.jar文件并为jai-ext的gt-utility类文件添加新类时,它工作正常。 我只是从github复制并添加到我的项目的src。 gt-utility是失踪的那个。 这些jar子也很矛盾。

您必须将jai-core.jar添加到类路径中

请按照GeoTools设置说明进行操作 :

Java高级映像Java高级映像是一种图像处理库,允许您以类似于函数式编程的方式形成操作链来处理栅格。

参考文献:

http://java.net/projects/jai-core下载此版本的JAI

Java Advanced Imaging API 1.1.3在撰写本文时,Oracle正在迁移Java项目 – 请尝试以下操作:

http://download.java.net/media/jai/builds/release/1_1_3/ http://download.java.net/media/jai/builds/release/1_1_3/INSTALL.html点击下载JAI以获取JDK在您的平台的链接上:

示例:jai-1_1_3-lib-windows-i586-jdk.exe

使用单击安装程序将JAI安装到JDK中

通过单击适用于您平台的链接,下载适用于您的JRE的JAI:

示例:jai-1_1_3-lib-windows-i586-jre.exe

使用单击安装程序将JAI安装到JRE中

(如果你正在使用linux,你当然需要选择合适的下载)