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

java.lang.NoClassDefFoundError:无法初始化类javax.media.jai.jai,java,jai,geotools,Java,Jai,Geotools,最近,我用GeoTools开始了我的第一个程序,其中我还使用了JAI-Java Advanced Imaging 1_1_2_01和JDK 1_7在我添加GeoTiff Jars之前,它工作得很好。我发现以下错误 线程“main”java.lang.NoClassDefFoundError中出现异常:无法初始化类javax.media.jai.jai 位于org.geotools.gce.geotiff.geotifreader.read(geotifreader.java:607) 在com.

最近,我用GeoTools开始了我的第一个程序,其中我还使用了JAI-Java Advanced Imaging 1_1_2_01和JDK 1_7在我添加GeoTiff Jars之前,它工作得很好。我发现以下错误

线程“main”java.lang.NoClassDefFoundError中出现异常:无法初始化类javax.media.jai.jai 位于org.geotools.gce.geotiff.geotifreader.read(geotifreader.java:607) 在com.rgb.PixelExtractor.extract(PixelExtractor.java:55) 位于com.rgb.rgbsplill.main(rgbsplill.java:136)

代码如下

 public void extract(File f, String name, String date) throws Exception {
 ParameterValue<OverviewPolicy> policy = AbstractGridFormat.OVERVIEW_POLICY
        .createValue();
 policy.setValue(OverviewPolicy.IGNORE);

 // this will basically read 4 tiles worth of data at once from the disk...
 ParameterValue<String> gridsize = AbstractGridFormat.SUGGESTED_TILE_SIZE.createValue();
 //gridsize.setValue(512 * 4 + "," + 512);

 // Setting read type: use JAI ImageRead (true) or ImageReaders read methods (false)
 ParameterValue<Boolean> 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()};

 }

 }
public void extract(文件f、字符串名称、字符串日期)引发异常{
ParameterValue策略=AbstractGridFormat.OVERVIEW\u策略
.createValue();
policy.setValue(OverviewPolicy.IGNORE);
//这将基本上一次从磁盘读取4个数据块。。。
ParameterValue gridsize=AbstractGridFormat.Suggered_TILE_SIZE.createValue();
//设置值(512*4+“,”+512);
//设置读取类型:使用JAI ImageRead(真)或ImageReaders读取方法(假)
参数值useJaiRead=AbstractGridFormat.USE_JAI_IMAGEREAD.createValue();
useJaiRead.setValue(true);
//reader.read(新的GeneralParameterValue[]{policy,gridsize,useJaiRead});
//抛出错误的那条线
GridCoverage二维图像
=新的GeoTiffReader(f).read(新的GeneralParameterValue[]{policy,gridsize,useJaiRead});
矩形2D bounds2D=image.getEnvelope2D().getBounds2D();
bounds2D.getCenterX();
//计算图像的缩放级别
GridGeometry2D几何体=image.getGridGeometry();
BuffereImage img=图像IO.read(f);
//ColorModel ColorModel=img.getColorModel(
WritableRaster raster=img.getRaster();
int numBands=graster.getNumBands();
int w=img.getWidth();
inth=img.getHeight();
外部:
对于(inti=0;i
JDK罐

其他罐子

我还为GeoTools JAR添加了类路径变量

编辑:


我的jai在没有GeoTools集成的情况下工作,但当我添加
gt-geotiff-14.4.jar
时,它尝试添加
jai-core-1.1.3.jar
,这与我的JDK1.7中的
jai-core.jar
冲突。因此,我删除了
jai-core-1.1.3.jar
和相关的jar,但仍然会给我同样的错误。

到您的类路径

请按照JAI的说明进行操作 :

Java Advanced Imaging Java Advanced Imaging是一种图像处理技术 库,用于形成处理光栅的操作链 以类似于函数式编程的方式

参考资料:

下载此版本的JAI

编写Oracle时的Java Advanced Imaging API 1.1.3是 迁移周围的java项目-请尝试以下操作:

单击平台的链接,下载JDK的JAI:

示例: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上工作,您当然需要选择 适当下载)


最后,当我删除Geotiff
jai-core-1.1.3.jar
jai-codec-1.1.3.jar
jai-imageio-1.1.jar
文件并为jai-ext的类文件添加新类时,它终于起作用了。我刚刚从github复制并添加到了我项目的src中。gt实用程序是缺失的一个。jar也相互冲突

@ParthTrivedi在您添加的地方,显示如何启动程序我正在使用添加JDK 1.7的eclipse,JAI已安装快照显示JAI JAR没有访问限制,我也设置了内存选项“-Xms512m-Xmx512m-XX:MaxPermSize=512m”现在它给我这个错误。我还在顺序和导出中选中了复选框。您确定吗你已经将它添加到类路径而不是构建路径了吗?没有,我只是添加到构建路径,让我检查一下添加到类路径的步骤。jai-1_1_2-lib-windows-i586-jre.exe和jai-1_1_2-lib-windows-i586-jdk.exe,我重新安装了,它们正确地出现在我的eclipse中,因为JAR显示的访问限制错误也解决了,现在JAI类初始化时只会出现此错误。所有步骤都是从该站点开始执行的,并且对整个JDK文件夹以及JRE文件夹都授予了完全权限,但仍然存在错误。GeoTools 14.x也适用于JDK1.7,JAI-1_1_2-lib也适用于JDK 1.7。请添加完整的stacktrace。它在上一节开始复制但我发现答案是相互矛盾的,所以不需要更多的答案。