Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jar并且找不到方法的符号(但找到了其他类方法)?_Java_Ant_Jar - Fatal编程技术网

Java jar并且找不到方法的符号(但找到了其他类方法)?

Java jar并且找不到方法的符号(但找到了其他类方法)?,java,ant,jar,Java,Ant,Jar,我真的有这个问题 因此,我有一个jar,其中包含一个用于处理数据库连接的类。在那门课上,我用了几种方法。在这个类中,我使用Ant创建了一个jar 昨天某个时候,我突然无法访问该db类中的最新方法。我得到: compile: [javac] C:\cygwin\home\user\Dev\Java\avc_alarm\build.xml:22: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=la

我真的有这个问题

因此,我有一个jar,其中包含一个用于处理数据库连接的类。在那门课上,我用了几种方法。在这个类中,我使用Ant创建了一个jar

昨天某个时候,我突然无法访问该db类中的最新方法。我得到:

compile:
[javac] C:\cygwin\home\user\Dev\Java\avc_alarm\build.xml:22: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 1 source file to C:\cygwin\home\user\Dev\Java\avc_alarm\build
[javac] C:\cygwin\home\user\Dev\Java\avc_alarm\src\se\gefa\avc_alarm\Main.java:9: error: cannot find symbol
[javac] symbolAliases = db.getAlarmSymbolAlias();
[javac]                   ^
[javac]   symbol:   method getAlarmSymbolAlias()
[javac]   location: variable db of type AvcDb
[javac] 1 error
尝试使用此类方法的代码:

package se.gefa.avc_alarm;

import se.gefa.avc_db.AvcDb;
import java.util.ArrayList;

public class Main {
    static AvcDb db  = new AvcDb();
    static ArrayList<String> symbolAliases;

    public static void main(String args[]) throws Exception {
        db.setupConnection("jdbc:h2:tcp://localhost/C:/XXXX/xyz", "sa", "");
        symbolAliases = db.getAlarmSymbolAlias();
    }
}
以及放入jar的db类:

package se.gefa.avc_db;

import java.sql.*;
import java.util.ArrayList;

public class AvcDb {

    // ---
    // Other methods that DO work
    // ---

    // The one that DO NOT work
    public ArrayList<String> getAlarmSymbolAlias() throws Exception {
        String query = "SELECT * FROM Alarm";
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(query);

        ArrayList<String> symbols = new ArrayList<String>();
        while (resultSet.next())
            symbols.add(resultSet.getString("symbol_alias"));

        return symbols;
    }
}
我正在使用Java7、Ant1.8.3和Vim。在IntelliJ中打开db jar时,我可以看到getAlarmSymbolAlias方法存在。正如我所说的,除了昨天添加的任何方法之外,我可以调用db类的任何其他方法。在IntelliJ中进行了一个简单的测试,它似乎可以工作,但当我在Vim、CL和Ant中设置了所有其他编辑器时,我不想学习新的编辑器

编辑Ant脚本:

<project name="AvcAlarm" default="dist" basedir=".">
  <description>
    Alarm program. 
  </description>

  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist" location="dist"/>
  <property name="lib" location="lib"/>

  <path id="classpath">
    <fileset dir="${lib}" includes="**/*.jar"/>
  </path>

  <target name="init">
    <tstamp/>
    <mkdir dir="${build}"/>
    <mkdir dir="${dist}"/>
  </target>

  <target name="compile" depends="init" description="compile the source " >
    <javac srcdir="${src}" destdir="${build}" classpathref="classpath"/>
  </target>

  <target name="dist" depends="compile" description="generate the distribution" >
    <jar destfile="${dist}/gefa_alarm.jar" basedir="${build}">
        <zipgroupfileset dir="lib" includes="*.jar" />
        <manifest>
            <attribute name="Main-Class" value="se/gefa/avc_alarm/Main"/>
        </manifest>
    </jar>
  </target>

  <target name="clean" description="clean up" >
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

您的类路径一定是错误的,或者您使用了不包含此方法的无效JAR版本


在使用OP进行调查后更新:lib文件夹中的另一个JAR包含不同版本的AvcDb,并且首先加载到类路径上,因此找不到所需的方法。

我怀疑在编译AvcDb.java时,您的JAR文件不在类路径上,或者您的类路径上有一个旧版本的TJAR,它具有不同的方法签名


您还应该删除可能从以前的生成中创建的所有旧*.class文件。在ANT build.xml中是否有一个prepare目标,在再次编译之前删除所有旧的构建工件?

既然您已经验证了JAR包含新添加的方法,那么类路径中应该有问题,并且加载了该类的其他旧版本。更改类路径的顺序,以便将这个jar文件设置在顶部

检查生成路径是否为当前路径,包括最新的源。您似乎有一条与生成路径相关的警告消息。请告诉我们您是如何生成应用程序的。project Eclipse文件、build.xml Ant文件或编译命令行,您的类路径一定是错误的。也许您的jar中有一个旧版本的AvcDb缺少getAlarmSymbolAlias。是的,我也是这么想的。但是我已经手动删除了包含AvcDb的新jar,然后将其复制到AvcAlarm的libdir中。此外,在IntelliJ或Eclipse中检查jar时,新jar的方法确实存在问题。您在IntelliJ中看到的jar文件是用于编译的,还是作为构建过程的结果而构建的?确保您正在清理attmeptsWell之间的所有构建工件,这是因为jar中的类中的其他方法可以工作。@daru:好的。告诉我们你是如何构建你的应用程序的,否则我们无法知道。据我们所知,您的类路径可能是正确的,但是您不可能用包含此方法的最新版本替换JAR。你制作了一个没有的早期版本吗?@daru:谢谢你的Ant脚本。我假设包含AvcDb的JAR在lib文件夹中?你能重新生成这个罐子并把它放回那里吗?我能,而且有。没有成功@daru:lib文件夹中的任何其他JAR,如果碰巧有AvcDb类在其中?我运行:ant clean compile dist。clean目标应该删除所有旧JAR和.class文件。但我当然也在用AvcDB创建jar时手动删除了它们