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



## Joob (14. Okt 2019)

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.


----------



## mihe7 (14. Okt 2019)

Joob hat gesagt.:


> Wo kommt das her und was bedeutet das ?











						warning in 6.8.0 with java 11 · Issue #61 · TIBCOSoftware/jasperreports
					

I am using jasper report 6.8.0 in my project and i get this warning when i upgrade to java 11 WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by net....




					github.com


----------



## Joob (15. Okt 2019)

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 ?


```
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:


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 (16. Okt 2019)

Joob hat gesagt.:


> 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:

```
JasperReport jasperReport = (JasperReport)
        JRLoader.loadObject(getClass().getResourceAsStream("/REPORTS/BlocksWords.jasper"));
```


----------



## Joob (16. Okt 2019)

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.





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


Wie kann ich herausfinden das da nicht läuft ?

Vielleicht habe ich bei Jasper etwas falsch installiert ?


----------



## mihe7 (16. Okt 2019)

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 (18. Okt 2019)

Hier ist mein Service.
Kannst du da etwas feststellen ?


```
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 (18. Okt 2019)

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

```
PrintServiceBlocks printService = new PrintServiceBlocks(...);
printService.exceptionProperty().addListener((obj, o, n) -> {
    if (n != null) {
        ((Exception) n).printStackTrace();
    }
});
printService.start();
```


----------



## Joob (19. Okt 2019)

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 

```
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 !
```


----------



## Joob (19. Okt 2019)

Meine Theorie mit der Anzeige ist Unsinn, denn der JasperFillManger wird nicht fertig und häng sich auf.


----------



## Creepaz (19. Okt 2019)

@mihe7 

```
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.


----------



## mihe7 (19. Okt 2019)

Joob hat gesagt.:


> denn der JasperFillManger wird nicht fertig und häng sich auf.


Es gibt ja ganz offensichtlich einen Fehler. Lass den Cast weg und schreib einfach `n.printStackTrace();`, dann sollte da was sinnvolleres rauskommen.



Creepaz hat gesagt.:


> Zwecks dem jetzigen Fehler ist mihe7 Schuld


So ist es


----------



## Joob (20. Okt 2019)

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.



```
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.

```
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 (20. Okt 2019)

Why do I get compilation error "org/codehaus/groovy/control/CompilationFailedException"?
					

I am trying to compile my JasperReports template using an Ant script and Java. I am getting this error:  jasper java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException




					stackoverflow.com
				




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.


----------



## mihe7 (20. Okt 2019)

@Wurstkopp  war schneller. 

"In order to solve mentioned issue simple edit your jrxml template and remove the language="groovy" attribute from jasperReport node." (http://grails-groovy.blogspot.com/2009/08/groovy-compilation-problem-while.html)


----------



## Joob (20. Okt 2019)

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:

```
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)
```


----------



## mihe7 (20. Okt 2019)

Joob hat gesagt.:


> Folgende Fehlermeldung:


Kommt da noch ein Cause?

EDIT: vielleicht hilft Dir das weiter: https://community.jaspersoft.com/wiki/ireport-errors-when-compiling-report-expressions-class-file


----------



## Joob (22. Okt 2019)

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 (22. Okt 2019)

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 (22. Okt 2019)

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

*Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java*


----------



## mihe7 (22. Okt 2019)

Joob hat gesagt.:


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


Tipp: setz ein @-Zeichen vor den Namen, dann wird er ggf. informiert, dass Du ihn in einem Beitrag genannt hast: also @Wurstkopp


----------



## Joob (22. Okt 2019)

@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 (22. Okt 2019)

Joob hat gesagt.:


> @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.


----------



## Joob (23. Okt 2019)

@Wurstkopp: Mach ich, ich schreib Sie unter 
http://www.java-forum.org/thema/jas...m-nach-umstellung-von-groovy-auf-java.186066/ 

dort habe ich einige Konfigurationen von meinem Jasper angezeigt.
Danke für deine Mühe.


----------

