Я пытаюсь скомпилировать jrxml с помощью ant. Я создал свой jrxml в iReports, поэтому у меня нет build.xml. При запуске команды ant запрашивает файл build.xml. Я создал этот файл в том же репертуаре, что и мой jrxml, но я не знаю, что я должен добавить в него, чтобы связать мой jrxml с моей банкой скриптлета. Я буду признателен за вашу помощь, я немного потерян.
компиляция jrxml с помощью скрипта с использованием ant
Ответы (1)
Шаблон отчета можно скомпилировать с помощью ant-задачи net.sf.jasperreports.ant.JRAntCompileTask.
Образец взят из здесь:
<path id="runClasspath">
<pathelement location="${path_to_jasper_libs}"/>
<pathelement path="${path_to_scriplet}\scriplet.jar"/>
</path>
<taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid="classpath"/>
</taskdef>
<target name="compile1">
<mkdir dir="./build/reports"/>
<jrc
srcdir="./reports"
destdir="./build/reports"
tempdir="./build/reports"
keepjava="true"
xmlvalidation="true">
<classpath refid="runClasspath"/>
<include name="**/*.jrxml"/>
</jrc>
</target>
<target name="compile2">
<mkdir dir="./build/reports"/>
<jrc
destdir="./build/reports"
tempdir="./build/reports"
keepjava="true"
xmlvalidation="true">
<src>
<fileset dir="./reports">
<include name="**/*.jrxml"/>
</fileset>
</src>
<classpath refid="runClasspath"/>
</jrc>
</target>
Цитата с сайта:
In addition to the srcdir and the destdir attributes, the jrc custom Ant task shipped with JasperReports supports the following attributes:
compiler : Name of the class that implements the JRCompiler interface to be used for compiling the reports (optional). xmlvalidation : Flag to indicate whether the XML validation should be performed on the source report template files (true by default). tempdir : Location to store the temporarily generated files (the current working directory by default). keepjava : Flag to indicate if the temporary Java files generated on the fly should be kept and not deleted automatically (false by default).
Рабочий образец:
Класс SampleJRScriptlet:
import com.google.common.base.Strings;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
public class SampleJRScriptlet extends JRDefaultScriptlet {
public String doubleField(String value) {
return Strings.repeat(value, 2);
}
}
Шаблон отчета для компиляции (файл report_with_scriplet.jrxml):
<jasperReport ... scriptletClass="SampleJRScriptlet">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString language="xPath">
<![CDATA[/Northwind/Customers]]>
</queryString>
<field name="CustomerID" class="java.lang.String">
<fieldDescription><![CDATA[CustomerID]]></fieldDescription>
</field>
<field name="CompanyName" class="java.lang.String">
<fieldDescription><![CDATA[CompanyName]]></fieldDescription>
</field>
<field name="ContactName" class="java.lang.String">
<fieldDescription><![CDATA[ContactName]]></fieldDescription>
</field>
<field name="ContactTitle" class="java.lang.String">
<fieldDescription><![CDATA[ContactTitle]]></fieldDescription>
</field>
<detail>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$P{REPORT_SCRIPTLET}.doubleField("$F{CustomerID}")]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{CompanyName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{ContactName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="300" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{ContactTitle}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Мой скрипт ant (файл compile_report.xml):
<project default="compile" basedir=".">
<path id="classpath">
<fileset dir="./../../target/alternateLocation">
<include name="jasperreports-4.1.2.jar"/>
<include name="commons-logging-1.0.2.jar"/>
<include name="commons-digester-1.7.jar"/>
<include name="commons-collections-2.1.jar"/>
<include name="commons-beanutils-1.8.0.jar"/>
<include name="groovy-all-1.0-jsr-05.jar"/>
</fileset>
</path>
<path id="runClasspath">
<path refid="classpath"/>
<pathelement path="./../../target/myscriplet.jar"/>
</path>
<taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid="classpath"/>
</taskdef>
<target name="compile">
<mkdir dir="./compiled_jasper"/>
<jrc
destdir="./compiled_jasper"
tempdir="./compiled_jasper"
keepjava="true"
xmlvalidation="true">
<src>
<fileset dir="./report">
<include name="**/*.jrxml"/>
</fileset>
</src>
<classpath refid="runClasspath"/>
</jrc>
</target>
</project>
Структура папки:
report
report_with_scriplet.jrxml
compile_report.xml
После запуска скрипта структура папок будет такой:
report
report_with_scriplet.jrxml
compiled_jasper
report_with_scriplet_1323195663885_780040.groovy
report_with_scriplet.jasper
compile_report.xml
person
Alex K
schedule
06.12.2011
Спасибо за ваш ответ. Вы знаете, где мы указываем путь к классу скрипта при компиляции jrxml? Я не вижу его в build.xml
- person maya-bf; 06.12.2011
Типа..я хоть там будет указан путь к классу скриптлета. Есть ли какие-либо идеи, как создается связь между путем к классу скриптлета и jrxml при компиляции?
- person maya-bf; 06.12.2011
У меня есть это: Неожиданный путь к элементу {} {antlib: org.apache.tools.ant} путь
- person maya-bf; 06.12.2011
@maya-bf Просто добавьте образец, чтобы ответить
- person Alex K; 06.12.2011