info look like :
module ir.mehritco.megnatis.faststonecapture {
requires javafx.controls;
requires javafx.fxml;
requires org.controlsfx.controls;
requires org.kordamp.bootstrapfx.core;
requires java.desktop;
requires camera.framework;
requires javafx.swing;
requires org.apache.logging.log4j;
requires org.apache.logging.log4j.core;
requires org.json;
requires org.xerial.sqlitejdbc;
requires com.ibm.icu;
requires camera.binding;
requires com.sun.jna;
requires org.apache.commons.imaging;
requires org.apache.commons.io;
opens ir.mehritco.megnatis.faststonecapture.gui to javafx.fxml;
exports ir.mehritco.megnatis.faststonecapture.gui;
exports ir.mehritco.megnatis.faststonecapture;
opens ir.mehritco.megnatis.faststonecapture to
javafx.fxml, org.apache.logging.log4j,
org.apache.logging.log4j.core, org.json,
org.xerial.sqlitejdbc, java.desktop;
exports ir.mehritco.megnatis.faststonecapture.canon;
opens ir.mehritco.megnatis.faststonecapture.opencv to javafx.graphics, javafx.fxml;
}
The Problem is, I need use class JPEGMetadata that is in JDK 17 under the com.sun.imageio.plugins.jpeg and java.desktop so I added The JPEGMetadata and As you can see The requires java.desktop; is present but I get error :
Exception in thread "Thread-6" java.lang.IllegalAccessError: class ir.mehritco.megnatis.faststonecapture.GraphicsPath (in module ir.mehritco.megnatis.faststonecapture) cannot access class com.sun.imageio.plugins.jpeg.JPEGMetadata (in module java.desktop) because module java.desktop does not export com.sun.imageio.plugins.jpeg to module ir.mehritco.megnatis.faststonecapture
at ir.mehritco.megnatis.faststonecapture/ir.mehritco.megnatis.faststonecapture.GraphicsPath.lambda$exportImageToFile$2(GraphicsPath.java:606)
at java.base/java.lang.Thread.run(Thread.java:833)
Idk what can I do to resolve it.
The part of Code that need this class:
new Thread(() -> {
try {
App.logger.debug("Going to create Export With File : " + fileName);
BufferedImage scaleUpImage = scale(bufferedImage, BufferedImage.TYPE_INT_ARGB,
(int) convertMMToPx(theWidthOfBondClipInMM()), (int) convertMMToPx(theHeightOfBondClipInMM())
, convertMMToPx(theWidthOfBondClipInMM()) / bufferedImage.getWidth()
, convertMMToPx(theHeightOfBondClipInMM()) / bufferedImage.getHeight());
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(ext);
while (writers.hasNext()) {
ImageWriter writer = writers.next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
return;
}
JPEGMetadata jpegMetadata = (JPEGMetadata) metadata;
try {
IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
horiz.setAttribute("value", Double.toString(getDpi()));
IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
vert.setAttribute("value", Double.toString(getDpi()));
IIOMetadataNode dim = new IIOMetadataNode("Dimension");
dim.appendChild(horiz);
dim.appendChild(vert);
jpegMetadata.mergeTree("Dimension", dim);
BufferedImage removeAlphaChannelAndScaleUpImage = removeAlphaChannel(scaleUpImage);
writer.write(jpegMetadata, new IIOImage(removeAlphaChannelAndScaleUpImage, null, jpegMetadata), writeParam);
Desktop desktop = Desktop.getDesktop();
try {
desktop.open(file);
} catch (Exception e) {
App.logger.fatal("Ops! look at this fatal error in opening the file explorer: " + e.getMessage());
}
return;
} catch (Exception e) {
e.printStackTrace();
}
}
} finally {
loadingBarForMes.setVisible(false);
}
}).start();
IIOMetadatato aJPEGMetadata? Given what you do with it, it seems unnecessary. Or am I missing something?metadata.mergeTreeis exactly the same as jpegMetadata.mergeTree.