WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ?

Joob

Top Contributor
Läuft immer noch nicht, bekomme nun folgende Fehlermeldungen wenn ich den Report complieren will


JasperReport jasperReport = JasperCompileManager.compileReport(getClass().getResourceAsStream("/REPORTS/BlocksWords.jrxml"));

dann wird in der Console dies ausgegeben,

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils (file:/C:/Users/Jupp/.gradle/caches/modules-2/files-2.1/net.sf.jasperreports/jasperreports/6.10.0/7dafa139d6ae10d9d0d965dc13aea32fcfeeeb19/jasperreports-6.10.0.jar) to constructor com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl()
WARNING: Please consider reporting this to the maintainers of net.sf.jasperreports.engine.util.ClassUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Wo kommt das her und was bedeutet das ?
Ich habe zwar die IDE und die JavaVersion upgedated aber nichts am Code geändert.
 

Joob

Top Contributor
Danke, die Warnung ist nun weg, leider war das nur eine Warnung und der Grund warum mein Bericht nicht angezeigt wird ist offensichtlich eine anderer.

Erst mal zu meiner Lösung : gradle build
compile group: 'xerces', name: 'xercesImpl', version: '2.8.0'

Leider hängt er sich immer noch beim Compilieren auf, könntest du mal einen Blick auf meinen Code werfen ?

Code:
                    if (reptyp.equals("BLOCK")) {
                        
                        JasperReport jasperReport = JasperCompileManager.compileReport(getClass().getResourceAsStream("/REPORTS/BlocksWords.jrxml"));
                        Map<String, Object> map = new HashMap<>();
                        List<RepBlocksWords> data = generateData_RepBlocksWords( blockID );
                        JRDataSource datasource = new JRBeanCollectionDataSource(data, true);
                        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, datasource);
                        JasperViewer.viewReport(jasperPrint,false);

bei folgender Projektstruktur:
12478

Ich bin mir nicht sicher das ich in der JasperReports für sich liegen können, mußten da nicht die Datenklassen im selben Paket liegen.

Ich will jetzt nicht ohne Not alles umstellen zumal das nur so eine trübe Erinnerung ist.
 

mihe7

Top Contributor
Leider hängt er sich immer noch beim Compilieren auf
Was heißt aufhängen? Gibt es Fehler?

Ich kenne mich mit Jasper nicht aus, aber wenn ich es richtig sehe, werden jrxml zu jasper-Dateien übersetzt.

Da stellt sich mir die Frage: warum willst Du Quelltext aus einem Jar denn zur Laufzeit übersetzen? Anders gefragt: warum übersetzt Du den Spaß nicht vorher und gibst die übersetzte jasper-Datei als Resource Deinem Jar mit? Würde doch auch etwas Zeit sparen...

Also etwas wie:
Java:
JasperReport jasperReport = (JasperReport)
        JRLoader.loadObject(getClass().getResourceAsStream("/REPORTS/BlocksWords.jasper"));
 

Joob

Top Contributor
Hab ich gemacht.
Dann wird die Zeile auch ausgeführt.
Allerdings hängt er sich dann beim Fillmanager auf.

Ich habe die einzelnen Componeten geprüft.
jasperReport ist da, mir sagen die Einträge nicht viel aber die Klasse ist angelegt.
Die Daten wurden generiert, das kann ich genau prüfen.
Und map hat die Größe 0, (Brauch ich auch nicht)

Leider bekomme ich von Jasper keinerlei Hinweis darauf was nicht funktioniert.
Ich sehe nur das der Thread nach einiger Zeit weiterläuft.

12480

12481

Hier der Thread, auch da kann man auf keine Ursache schließen.
12482

Wie kann ich herausfinden das da nicht läuft ?

Vielleicht habe ich bei Jasper etwas falsch installiert ?
 

mihe7

Top Contributor
Wenn Du keine Fehlermeldung bekommst, dann vermute ich mal stark, dass Du irgendwo eine Exception verschluckst. In welcher Klasse befindet sich die markierte Zeile task.runLater(() -> {?
 

Joob

Top Contributor
Hier ist mein Service.
Kannst du da etwas feststellen ?

Code:
 private static class PrintServiceBlocks extends Service<Void> {

        /**
        * This Service was called from the Method [handlecoursesuserprint] and [handlecourseswordreport]
        * Preview the report from the beans
        *
        * zu beachten :
        * platform.runlater wird zweimal aufgerufen, nämlich immer
        * dann wenn etwas an dem Steuerelement welche nur im JavaFX Thread ausgeführt
        * wird geändert wird.
        * Also ganz einfach: mit Platform.runLater bekomme ich Zugriff auf den JavaFX Thread
        * mal wird es in einer Schleife immer wieder aufgerufen,
        * hier wird es vor und nach dem Ablauf der Reporterstellung verwendet
        *
        * @param proindi            , Progressindicator
        * @param reptyp             , Report Typ
        * @param idblock            , id for Block for printing one block
        * @param idlanguage         , language id for printing all blocks of this language
        *
        *
        * @throws MalformedURLException, IOException on error.   
        */       
        
        private ProgressIndicator proindi;
        private String reptyp;
        private String blockID;
        private String languageID;
        
        
        
        public PrintServiceBlocks (ProgressIndicator proindi, String strreptyp, String stridlanguage, String stridblock) {
            
            this.proindi            = proindi;
            this.reptyp             = strreptyp;
            this.languageID         = stridlanguage;
            this.blockID            = stridblock;
            
        }
        
            @Override
            protected Task<Void> createTask() {
                return new Task<Void>() {

                    @Override
                    protected Void call() throws Exception {
                    
                        
                    // ProgressIndicator auf immer Indeterminate setzen
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            proindi.setProgress(-1);
                        }
                    });
                    
                        
                    if (reptyp.equals("BLOCK")) {

                        JasperReport jasperReport = (JasperReport)JRLoader.loadObject(getClass().getResourceAsStream("/REPORTS/BlocksWords.jasper"));
                        
//                        JasperReport jasperReport = JasperCompileManager.compileReport(getClass().getResourceAsStream("/REPORTS/BlocksWords.jrxml"));
                        Map<String, Object> map = new HashMap<>();
                        List<RepBlocksWords> data = generateData_RepBlocksWords( blockID );
                        JRDataSource datasource = new JRBeanCollectionDataSource(data, true);
                        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, datasource);
                        JasperViewer.viewReport(jasperPrint,false);
                      
                        
                    } else if (reptyp.equals("ALLBLOCKS")) {

                        JasperReport jasperReport = (JasperReport)JRLoader.loadObject(getClass().getResourceAsStream("/REPORTS/Blocks.jasper"));
//                        JasperReport jasperReport = JasperCompileManager.compileReport(getClass().getResourceAsStream("/REPORTS/Blocks.jrxml"));
                        Map<String, Object> map = new HashMap<>();
                        List<RepBlocks> data = generateData_RepBlocks( languageID );
                        JRDataSource datasource = new JRBeanCollectionDataSource(data, true);
                        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, datasource);
                        JasperViewer.viewReport(jasperPrint,false);
                        
                        
                    } else {

                        // platform wird hier gebraucht, damit für setProgress Zugriff auf FXThread möglich ist
                        // und der Progressindicator auf fertig gesetzt werden kann.
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                Alert alert = new Alert(Alert.AlertType.ERROR);
                                alert.setTitle("Unknown Report");
                                alert.setHeaderText("CoursesHeaderController");
                                alert.setContentText("Selected report was unknown !");
                                DialogPane dialogPane = alert.getDialogPane();
                                dialogPane.getStylesheets().add(getClass().getResource("/CSS/DialogBase.css").toExternalForm());
                                dialogPane.getStyleClass().add("Dialog");
                                alert.showAndWait();                   
                            }
                        });                       
                    }
                  
                    
                    // platform wird hier gebraucht, damit für setProgress Zugriff auf FXThread möglich ist
                    // und der Progressindicator auf fertig gesetzt werden kann.
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            proindi.setProgress(1);
                        }
                    });

                    return null;
                        
                    }
               };
            }
    }
 

mihe7

Top Contributor
Oh, JavaFX, damit ist alles von meiner Seite ohne Gewähr :)

Du müsstest beim Aufruf des Services einen "Exception Handler" registrieren, also etwas wie
Java:
PrintServiceBlocks printService = new PrintServiceBlocks(...);
printService.exceptionProperty().addListener((obj, o, n) -> {
    if (n != null) {
        ((Exception) n).printStackTrace();
    }
});
printService.start();
 

Joob

Top Contributor
Erst mal danke für den Tip.
Ich bekomme jetzt auch eine Exception, aber diese bezieht sich leider nicht auf jasper.
Kann es sein das Jasper fertig ist, jedoch den Report nicht anzeigen kann, das dann zu einem Problem beim Thread führt.
Ich frage deshalb weil ich nicht sicher bin ob alles für Jasper richtig konfiguriert ist.

Könntest du mal auf die Exception schauen
Code:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class java.lang.NoClassDefFoundError cannot be cast to class java.lang.Exception (java.lang.NoClassDefFoundError and java.lang.Exception are in module java.base of loader 'bootstrap')
    at org.joobsoft.vt.CONTROLLER.BlocksHeaderPrintController.lambda$handleblockprint$0(BlocksHeaderPrintController.java:103)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:106)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
    at javafx.base/javafx.beans.property.ObjectPropertyBase$Listener.invalidated(ObjectPropertyBase.java:234)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:136)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:106)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
    at javafx.graphics/javafx.concurrent.Task._setException(Task.java:966)
    at javafx.graphics/javafx.concurrent.Task$TaskCallable.lambda$call$2(Task.java:1454)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:830)
TimerTask !
 

Creepaz

Bekanntes Mitglied
@mihe7
Java:
PrintServiceBlocks printService = new PrintServiceBlocks(...);
printService.exceptionProperty().addListener((obj, o, n) -> {
    if (n != null) {
        ((Exception) n).printStackTrace();
    }
});
printService.start();

Zwecks dem jetzigen Fehler ist mihe7 Schuld ;) Einen NoClassDefFoundError kannst du nicht zu einer Exception casten, deswegen zeigt er dir den jetzigen Fehler.
 

Joob

Top Contributor
Hey, jetzt kommt ne aussagefähige Fehlermeldung.
Wenn ich das richtig deute fehlt groovy und muss in der gradle.build eingetragen werden, oder ?

Wenn das so ist, stellt sich die Frage wie integriere ich groovy in der Build richtig.


Code:
java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException
    at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3138)
    at java.base/java.lang.Class.getConstructor0(Class.java:3343)
    at java.base/java.lang.Class.getConstructor(Class.java:2152)
    at net.sf.jasperreports.engine.JasperCompileManager.getCompiler(JasperCompileManager.java:823)
    at net.sf.jasperreports.engine.JasperCompileManager.getEvaluator(JasperCompileManager.java:381)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator(JRFillDataset.java:487)
    at net.sf.jasperreports.engine.fill.BaseReportFiller.<init>(BaseReportFiller.java:168)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:273)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:79)
    at net.sf.jasperreports.engine.fill.JRFiller.createBandReportFiller(JRFiller.java:251)
    at net.sf.jasperreports.engine.fill.JRFiller.createReportFiller(JRFiller.java:272)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:156)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:145)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:758)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:1074)
    at org.joobsoft.vt.CONTROLLER.BlocksHeaderPrintController$PrintServiceBlocks$1.call(BlocksHeaderPrintController.java:211)
    at org.joobsoft.vt.CONTROLLER.BlocksHeaderPrintController$PrintServiceBlocks$1.call(BlocksHeaderPrintController.java:188)
    at javafx.graphics/javafx.concurrent.Task$TaskCallable.call(Task.java:1425)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at javafx.graphics/javafx.concurrent.Service.lambda$executeTask$6(Service.java:725)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/javafx.concurrent.Service.lambda$executeTask$7(Service.java:724)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.control.CompilationFailedException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 26 more

Hier ist meine Build.
Code:
plugins {
  id 'java'
  id 'application'
  id 'jacoco'
 
  id 'org.openjfx.javafxplugin' version '0.0.8'
 
}


repositories {
    
    jcenter()

}




dependencies {
    
    
    
    compile group: 'org.json', name: 'json', version: '20171018'
    compile group: 'com.jcraft', name: 'jsch', version: '0.1.50'
    compile group: 'commons-net', name: 'commons-net', version: '3.6'
    compile group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.4'
    compile group: 'com.googlecode.soundlibs', name: 'jlayer', version: '1.0.1.4'
    
    compile group: 'xerces', name: 'xercesImpl', version: '2.8.0'                       // wegen der Verwendung von Grammatiken durch jasper
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'                       // abhängigkeit von jasper
    compile group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.10.0'     //

    
    testCompile 'junit:junit:4.12'

    
}


javafx {
    
    modules = [ 'javafx.base', 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.media', 'javafx.swing', 'javafx.web' ]
    version = "13"
}



mainClassName = 'org.joobsoft.vt.MAIN.Main'
 

Wurstkopp

Bekanntes Mitglied

Entweder Groovy als Sprache aus dem Report entfernen (Würde ich empfehlen wenn du das nicht explizit nutzt) oder halt die Groovy Dependency hinzufügen.
 

Joob

Top Contributor
Wenn ich von Groovy auf Java ändere kann er nicht mehr kompelieren.
das hat offensichtlich etwas mit der Expression Class zu tun und somit mit den Datenbankfeldern.
Ich finde nur keine Möglichkeit dort etwas anderes einzutragen oder Ihm irgendwie zu vermitteln wo die Klasse zu finden ist.

Folgende Fehlermeldung:
Code:
  Compiling to file... C:\Users\Jupp\Documents\NetBeansProjects\VTDESKTOP\src\main\resources\REPORTS\Blocks.jasper
Errors compiling C:\Users\Jupp\Documents\NetBeansProjects\VTDESKTOP\src\main\resources\REPORTS\Blocks.jasper!
Compilation exceptions: com.jaspersoft.ireport.designer.compiler.ErrorsCollector@6a473f46  net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files /* ^ 1 errors      at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204)     at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:512)     at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1418)     at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)     at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278)     at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033)


12490
 

Joob

Top Contributor
Nee leider nicht,
es wird irgend etwas mit den Jaspereinstellungen hinsichtlich der Complierung zu tun haben, da ich das Compilen ja nicht mehr
in der Methode sondern in der IDE mache.

Ich habe schon überall geschaut aber finde nichts brauchbares.
 

Joob

Top Contributor
Ich mach da noch mal ein Frage zu auf die genauer auf das Problem mit dem Sprachwechsel zielt.

An Wurstkopp: Hast du Berichte mit der Sprache Java compiliert ?
 

Joob

Top Contributor
Hier die neue Frage:
ich habe versucht alle möglichen Komponeteneinstellungen anzuzeigen.

Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java
 

Joob

Top Contributor
@Wurstkopp : Hast du Berichte mit der Sprache Java compiliert

wenn ja wie ist dein Jasper konfiguriert.
Schau mal ich hab das Problem noch mal zusammengefaßt, es hat sich ja im Laufe der Zeit ganz schön verändert.
 

Wurstkopp

Bekanntes Mitglied
@Wurstkopp : Hast du Berichte mit der Sprache Java compiliert

wenn ja wie ist dein Jasper konfiguriert.
Schau mal ich hab das Problem noch mal zusammengefaßt, es hat sich ja im Laufe der Zeit ganz schön verändert.

Ja. Tatsächlich nehme ich immer Java statt Groovy für die Report-Expressions. Kannst du die jrxml einfach mal hochladen, dann könnte man ggf. schneller sehen ob der Fehler in deiner Konfiguration oder doch im Report selbst liegt.

Ansonsten nichts spezielles konfiguriert. Früher mit iReport und jetzt mit JasperStudio kompiliert.
 

Ähnliche Java Themen

Neue Themen


Oben