Bom dia, criei um relatório em jasper, gerei .jar da aplicação para rodar fora do eclipse, coloquei o caminho correto com getabsolutPath, pega normal, ao executar pelo eclipse, funcionar, se eu executar fora funciona somente se o caminho de criação do jasper estiver ok. Não deveria funcionar pegando o diretório padrão?
Fonte:
public void negAtraso() throws IOException, JRException {
BusinessDAODB businessDAODB = new BusinessDAODB();
arquivo = new File("negAtraso.jasper");
String caminho = arquivo.getAbsolutePath();
System.out.println(caminho);
System.out.println(arquivo.getAbsolutePath());
List<BusinessPojo> negocios;
negocios = businessDAODB.negAtraso();
if (negocios.size() > 0) {
JasperReport relatorio = (JasperReport) JRLoader.loadObjectFromFile(caminho);
JasperPrint print = JasperFillManager.fillReport(relatorio, null, new JRBeanCollectionDataSource(negocios));
JasperViewer.viewReport(print, false);
}else{
notifier.notify(new Notification("Erro", "Não há dados a serem gerados", Notification.ERROR_ICON));
}
}
Erro gerado ao executar mesmo colocando o arquivo(Jasper gerado) junto com o .jar
Caused by: java.lang.IllegalArgumentException: name
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:693)
at sun.misc.URLClassPath.findResource(URLClassPath.java:215)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at java.lang.ClassLoader.getResource(ClassLoader.java:1096)
at net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResou
rce(JRResourcesUtil.java:569)
at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(Def
aultRepositoryService.java:110)
at net.sf.jasperreports.repo.InputStreamPersistenceService.load(InputStr
eamPersistenceService.java:47)
at net.sf.jasperreports.repo.DefaultRepositoryService.getResource(Defaul
tRepositoryService.java:159)
at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUt
il.java:190)
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(Reposit
oryUtil.java:206)
at net.sf.jasperreports.engine.RenderableUtil.getRenderable(RenderableUt
il.java:122)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImag
e.java:584)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.jav
a:520)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFi
llElementContainer.java:258)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:
454)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVertica
lFiller.java:318)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRV
erticalFiller.java:254)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVertic
alFiller.java:122)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:
551)
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFill
er.java:411)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:122)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.
java:667)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillMa
nager.java:983)
at br.ind.risc.follow.controller.MainController.negAtraso(MainController
.java:144)
... 53 more
Diretório padrão seria o diretório onde o jar se encontra?
Esta mensagem me intriga Caused by: java.lang.IllegalArgumentException: name.
Onde está a parte do Caused By do stacktrace do erro?
Está no mesmo caminho, coloquei um System.out pra ver.
Segue o erro completo.
C:\Risc>java -jar FollowTE.jar
C:\Risc\negAtraso.jasper
C:\Risc\negAtraso.jasper
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java
.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader
.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Comp
ositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:191)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContaine
r.doSelect(ContextMenuContent.java:1405)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContaine
r.lambda$createChildren$343(ContextMenuContent.java:1358)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.h
andleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Comp
ositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(C
ompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotificatio
n.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotificatio
n.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEve
nt$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Quantum
Toolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Glas
sViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.ja
va:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
... 43 more
Caused by: java.lang.IllegalArgumentException: name
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:693)
at sun.misc.URLClassPath.findResource(URLClassPath.java:215)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at java.lang.ClassLoader.getResource(ClassLoader.java:1096)
at net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResou
rce(JRResourcesUtil.java:569)
at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(Def
aultRepositoryService.java:110)
at net.sf.jasperreports.repo.InputStreamPersistenceService.load(InputStr
eamPersistenceService.java:47)
at net.sf.jasperreports.repo.DefaultRepositoryService.getResource(Defaul
tRepositoryService.java:159)
at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUt
il.java:190)
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(Reposit
oryUtil.java:206)
at net.sf.jasperreports.engine.RenderableUtil.getRenderable(RenderableUt
il.java:122)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImag
e.java:584)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.jav
a:520)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFi
llElementContainer.java:258)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:
454)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVertica
lFiller.java:318)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRV
erticalFiller.java:254)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVertic
alFiller.java:122)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:
551)
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFill
er.java:411)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:122)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.
java:667)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillMa
nager.java:983)
at br.ind.risc.follow.controller.MainController.negAtraso(MainController
.java:144)
... 53 more
Refiz o código inteiro, utilizei um exemplo da internet para JavaFX não abre, curioso é que não tenho nenhuma mensagem de erro no console.
O mais estranho ainda é que se eu executar o jar em qualquer local do computador ele funciona somente se o local de criação dos fontes estiver ok, coloquei o fonte para pegar o .jasper gerado de qualquer local.
Novo código.
Chamada:
public void negAtraso() throws IOException, JRException {
try {
BusinessDAODB businessDAODB = new BusinessDAODB();
arquivo = new File("negAtraso.jasper");
String caminho = arquivo.getAbsolutePath();
System.out.println(caminho);
System.out.println(arquivo.getAbsolutePath());
List<BusinessPojo> negocios;
negocios = businessDAODB.negAtraso();
Report report = new Report(caminho, ownerWindow);
report.printPreview(null, new JRBeanCollectionDataSource(negocios));
} catch (Exception e) {
e.printStackTrace();
}
/*if (negocios.size() > 0) {
JasperReport relatorio = (JasperReport) JRLoader.loadObjectFromFile(caminho);
JasperPrint print = JasperFillManager.fillReport(relatorio, null, new JRBeanCollectionDataSource(negocios));
JasperViewer.viewReport(print, false);
} else {
notifier.notify(new Notification("Erro", "Não há dados a serem gerados", Notification.ERROR_ICON));
}*/
//btnFechar.getScene().getWindow().hide();
}
Geração:
public class Report {
private JasperReport jasperReport;
private Window ownerWindow;
public Report(String reportFileName, Window ownerWindow) {
try {
// jasperReport = (JasperReport)
// JRLoader.loadObject(JRLoader.getResourceInputStream(reportFileName));
jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFileName);
this.ownerWindow = ownerWindow;
} catch (JRException ex) {
ex.printStackTrace();
}
}
public void export(String fileChooserTitle, String fileName, Map<String, Object> paramMap,
JRBeanCollectionDataSource dataSource) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(fileChooserTitle);
fileChooser.setInitialFileName(fileName);
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("PDF files", "*.pdf"),
new FileChooser.ExtensionFilter("Excel files", "*.xlsx"),
new FileChooser.ExtensionFilter("Word files", "*.docx"));
File selectedFile = fileChooser.showSaveDialog(ownerWindow);
if (selectedFile != null) {
ownerWindow.getScene().setCursor(Cursor.WAIT);
String extension = "";
int i = selectedFile.getName().lastIndexOf('.');
if (i > 0)
extension = fileName.substring(i + 1);
try {
Exporter exporter;
switch (extension.toLowerCase()) {
case "pdf":
exporter = new JRPdfExporter();
SimplePdfExporterConfiguration config = new SimplePdfExporterConfiguration();
config.setMetadataCreator("App name");
exporter.setConfiguration(config);
break;
case "xlsx":
exporter = new JRXlsxExporter();
break;
case "docx":
exporter = new JRDocxExporter();
break;
default:
return;
}
exporter.setExporterInput(
new SimpleExporterInput(JasperFillManager.fillReport(jasperReport, paramMap, dataSource)));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(selectedFile));
exporter.exportReport();
} catch (JRException ex) {
ex.printStackTrace();
} catch (JRRuntimeException ex) { // File is being used by another
// process and cannot be
// overwritten
System.out.println(ex.getMessage());
} finally {
ownerWindow.getScene().setCursor(Cursor.DEFAULT);
}
}
}
public void print(Map<String, Object> paramMap, JRBeanCollectionDataSource dataSource) {
Task<JasperPrint> task = createReportTask(paramMap, dataSource);
task.setOnSucceeded((WorkerStateEvent event) -> {
ownerWindow.getScene().setCursor(Cursor.DEFAULT);
try {
JasperPrintManager.getInstance(DefaultJasperReportsContext.getInstance()).print(task.getValue(), true);
} catch (JRException ex) {
ex.printStackTrace();
}
});
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}
public void printPreview(Map<String, Object> paramMap, JRBeanCollectionDataSource dataSource) {
try {
Task<JasperPrint> task = createReportTask(paramMap, dataSource);
task.setOnSucceeded((WorkerStateEvent event) -> {
ownerWindow.getScene().setCursor(Cursor.DEFAULT);
JRPrintPreview printPreview = new JRPrintPreview(task.getValue());
printPreview.initOwner(ownerWindow);
printPreview.show();
});
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private Task<JasperPrint> createReportTask(Map<String, Object> paramMap, JRBeanCollectionDataSource dataSource) {
Task<JasperPrint> task = new Task<JasperPrint>() {
@Override
protected JasperPrint call() throws Exception {
ownerWindow.getScene().setCursor(Cursor.WAIT);
return JasperFillManager.fillReport(jasperReport, paramMap, dataSource);
}
};
task.setOnFailed(event -> ownerWindow.getScene().setCursor(Cursor.DEFAULT));
return task;
}
}