SPLWare/esProc

项目在fast jar 打包模式下,LocalFile.getFile() 不支持返回 resources 下的splx/dfx脚本文件

FengMingJian opened this issue · 6 comments

项目在fast jar 打包模式下,LocalFile.getFile() 不支持返回 resources 下的splx/dfx脚本文件,会抛出“文件 {0} 不存在”异常

请问方便发一下调用堆栈吗?
jar包里的文件只能读成InputStream,应该调用LocalFile.getInputStream取输入流

raqsoftConfig.xml 配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Config Version="3">
    <Runtime>
        <DBList>
        </DBList>
        <Esproc>
            <charSet>UTF-8</charSet>
            <splPathList>
                <splPath></splPath>
            </splPathList>
            <dateFormat>yyyy-MM-dd</dateFormat>
            <timeFormat>HH:mm:ss</timeFormat>
            <dateTimeFormat>yyyy-MM-dd HH:mm:ss</dateTimeFormat>
            <mainPath></mainPath>
            <tempPath></tempPath>
            <bufSize>65536</bufSize>
            <localHost/>
            <localPort>0</localPort>
            <parallelNum/>
            <cursorParallelNum/>
            <blockSize/>
            <nullStrings>nan,null,n/a</nullStrings>
            <fetchCount/>
            <extLibsPath/>
        </Esproc>
        <Logger>
            <Level>OFF</Level>
        </Logger>
    </Runtime>
    <JDBC>
    </JDBC>
</Config>

项目结构如下:

src
|---main
     |---java
     |---resources
          |---raqsoftConfig.xml
          |---STUDENT_SCORE_LIST.splx

Java 调用 代码如下:

Connection con = null;
java.sql.PreparedStatement st;

try
{
    Class.forName("com.esproc.jdbc.InternalDriver");
    con= DriverManager.getConnection("jdbc:esproc:local://");

    st =con.prepareCall("call STUDENT_SCORE_LIST(?)");
    st.setObject(1,"C:/Users/fengm/OneDrive/文档/学生成绩.xlsx");

    st.execute();

    ResultSet rs = st.getResultSet();
}
catch (Exception e)
{
    e.printStackTrace();
}

调用堆栈信息如下:

java.sql.SQLException: 文件 STUDENT_SCORE_LIST 不存在
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:286)
	at com.esproc.jdbc.InternalStatement$1.run(InternalStatement.java:148)
Caused by: com.scudata.common.RQException: 文件 STUDENT_SCORE_LIST 不存在
	at com.scudata.app.common.AppUtil.readCellSet(AppUtil.java:798)
	at com.scudata.expression.fn.JDBCCall.calculate(JDBCCall.java:70)
	at com.scudata.expression.Expression.calculate(Expression.java:143)
	at com.scudata.expression.fn.Eval.calc(Eval.java:88)
	at com.esproc.jdbc.JDBCUtil.execute(JDBCUtil.java:418)
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:267)
	... 1 more

集算器v2018这个版本是支持这样调用脚本文件的

看异常信息跟最新版的jar包不匹配,我看了一下目前的实现应该没这个错误。
请换最新版的集算器的jar包试一下。

替换了最新版(20220228版本)的jar包,依旧抛出以下错误信息,望请排除,谢谢

java.sql.SQLException: 文件 STUDENT_SCORE_LIST 不存在
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:286)
	at com.esproc.jdbc.InternalStatement$1.run(InternalStatement.java:148)
Caused by: com.scudata.common.RQException: 文件 STUDENT_SCORE_LIST 不存在
	at com.scudata.app.common.AppUtil.readCellSet(AppUtil.java:795)
	at com.scudata.expression.fn.JDBCCall.calculate(JDBCCall.java:68)
	at com.scudata.expression.Expression.calculate(Expression.java:143)
	at com.scudata.expression.fn.Eval.calc(Eval.java:88)
	at com.esproc.jdbc.JDBCUtil.execute(JDBCUtil.java:418)
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:267)
	... 1 more

替换了最新版(20220228版本)的jar包,依旧抛出以下错误信息,望请排除,谢谢

java.sql.SQLException: 文件 STUDENT_SCORE_LIST 不存在
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:286)
	at com.esproc.jdbc.InternalStatement$1.run(InternalStatement.java:148)
Caused by: com.scudata.common.RQException: 文件 STUDENT_SCORE_LIST 不存在
	at com.scudata.app.common.AppUtil.readCellSet(AppUtil.java:795)
	at com.scudata.expression.fn.JDBCCall.calculate(JDBCCall.java:68)
	at com.scudata.expression.Expression.calculate(Expression.java:143)
	at com.scudata.expression.fn.Eval.calc(Eval.java:88)
	at com.esproc.jdbc.JDBCUtil.execute(JDBCUtil.java:418)
	at com.esproc.jdbc.InternalStatement.executeJDBC(InternalStatement.java:267)
	... 1 more

您好,已经找到了问题,刚刚修复提交了。请更新代码后重试,谢谢!

已验证,问题已经修复