在使用 Ant 编译的文件中找不到主类

2023-11-22

我在 Eclipse 中编译并运行我的程序,一切正常,但是当我用 Ant 打包它并运行它时,出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/supercsv/io/ICsvB
eanReader
Caused by: java.lang.ClassNotFoundException: org.supercsv.io.ICsvBeanReader
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: jab.jm.main.Test. Program will exit.

请注意,这是一个runtime错误而不是编译器错误与蚂蚁。

我过去构建这个项目时遇到了 0 个问题,现在当我向 lib 文件夹中添加第二个包时,它突然对我起作用?

这是供参考的构建文件:

<?xml version="1.0" ?>

<project name="ServerJar" default="dist" basedir=".">
 <description>
  Builds client files into .jar
 </description>
 <!-- [build variables] -->
 <property name="src" location="src" />
 <property name="build" location="build" />
 <property name="dist" location="dist" />
 <property name="lib" location="lib" />
 <!-- [path to packages] -->
 <path id="master-classpath">
     <fileset dir="${lib}">
         <include name="*.jar"/>
     </fileset>
 </path>


 <target name="init">
  <!-- makes time stamp to be used in jar name -->
  <tstamp />
  <!-- creates build directory structure -->
  <mkdir dir="${build}" />
 </target>

 <target name="compile" depends="init" description="Compiles the source">
  <!-- compiles the java code from ${src} into ${build} -->
  <!-- <javac srcdir="${src}" destdir="${build}" /> -->
  <javac destdir= "${build}">
      <src path="${src}"/>
      <classpath refid="master-classpath"/>
  </javac>
 </target>

 <target name="dist" depends="compile" description="Generates distributable">
  <!-- creates the distribution directory -->
  <mkdir dir="${dist}/lib" />

  <!-- puts everything in ${build} into the jar file -->
  <jar jarfile="${dist}/lib/CC-${DSTAMP}.jar" basedir="${build}">
   <manifest>
    <attribute name="Main-Class" value="jab.jm.main.Test" />
   </manifest>
  </jar>

  <!-- makes a jar file for quick test execution -->
  <jar jarfile="${dist}/lib/CC.jar" basedir="${build}">
   <manifest>
    <attribute name="Main-Class" value="jab.jm.main.Test" />
   </manifest>
  </jar>
 </target>

 <target name="clean" description="Cleans up the extra build files">
  <!-- deletes the ${build} and ${dist} directories -->
  <delete dir="${build}" />
  <delete dir="${dist}" />
 </target>
</project>

先谢谢您的帮助!

EDIT:

这是我的主类的构造的样子(这不是实际的文件,但这是我的基础)。对于 java 程序来说,这种构造非常奇怪,可能会给 Ant 带来一些问题。关于如何重建这个有什么建议吗?当我试图将其分成多个部分时,我遇到了很多错误。我以前从未见过这样的构造(是的,我理解它是如何工作的(并且它在编译时是这样的),但 Ant 可能不喜欢它)。

import java.io.FileReader;
import java.io.IOException;

import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.constraint.StrMinMax;
import org.supercsv.cellprocessor.constraint.Unique;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

class ReadingObjects {
    static final CellProcessor[] userProcessors = new CellProcessor[] {
        new Unique(new StrMinMax(5, 20)),
        new StrMinMax(8, 35),
        new ParseDate("dd/MM/yyyy"),
        new Optional(new ParseInt()),
        null
    };

    public static void main(String[] args) throws Exception {
        ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
        try {
          final String[] header = inFile.getCSVHeader(true);
          UserBean user;
          while( (user = inFile.read(UserBean.class, header, userProcessors)) != null) {
            System.out.println(user.getZip());
          }
        } finally {
          inFile.close();
        }
   }
}

public class UserBean {
    String username, password, town;
    Date date;
    int zip;

    public Date getDate() {
        return date;
    }
    public String getPassword() {
        return password;
    }
    public String getTown() {
        return town;
    }
    public String getUsername() {
        return username;
    }
    public int getZip() {
        return zip;
    }
    public void setDate(final Date date) {
        this.date = date;
    }
    public void setPassword(final String password) {
        this.password = password;
    }

    public void setTown(final String town) {
        this.town = town;
    }
    public void setUsername(final String username) {
        this.username = username;
    }
    public void setZip(final int zip) {
        this.zip = zip;
    }
}

请注意该类的名称实际上是 UserBean,并且它包含一个名为 ReadingObjects 的非公共类,该类包含 main 方法。


看起来您的运行时类路径缺少包含该类的 jarorg.supercsv.io.ICsvBeanReader.

The gotcha问题是在调用可执行 jar 时无法从命令行设置类路径。您必须在清单中设置它,如下所示:

<target name="dist" depends="compile" description="Generates distributable">
    <!-- creates the distribution directory -->
    <mkdir dir="${dist}/lib" />

    <!-- Remove manifest. This jar will end up on the classpath of CC.jar -->
    <jar jarfile="${dist}/lib/CC-${DSTAMP}.jar" basedir="${build}"/>

    <!-- Fancy task that takes the pain out creating properly formatted manifest value -->
    <manifestclasspath property="mf.classpath" jarfile="${dist}/lib/CC.jar">
        <classpath>
            <fileset dir="${dist}/lib" includes="*.jar"/>
        </classpath><!--end tag-->
    </manifestclasspath>

    <!-- This is the executable jar -->
    <jar jarfile="${dist}/lib/CC.jar" basedir="${build}">
        <manifest>
            <attribute name="Main-Class" value="jab.jm.main.Test"/>
            <attribute name="Class-Path" value="${mf.classpath}"/> 
        </manifest>
    </jar>

</target>

这种方法将允许您按如下方式运行 jar:

java -jar CC.jar

如果没有额外的清单条目,您必须按如下方式运行 jar:

java -cp CC.jar:CC-DSTAMPVALUE.jar jab.jm.main.Test

Note

只有 CC.jar 是可执行的,并且需要特殊的清单。使用此模式意味着将来放置到 lib 目录中的其他 jar 文件将自动包含在运行时类路径中。 (对于 log4j 等开源依赖项很有用)

显然,当运行 CC.jar 时,如果 jar 文件不存在,您将收到类似的错误:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在使用 Ant 编译的文件中找不到主类 的相关文章

随机推荐

  • Webusb:尝试在 Windows 上打开打印机时访问被拒绝

    我试图允许 POS Web 应用程序使用 Chrome webusb API 直接打印到 StarMicronics 或任何收据打印机 我正在使用这个例子here几乎完全一样 除了我修改了vendorId过滤到 StarMicronics
  • 将日期时间字符串转换为 R 中的 POSIXct 日期/时间格式

    考虑格式中的字符串 test lt YYYY MM DDT00 00 00 000 08 00 我的目标是将这些字符串转换为POSIXct格式 以便我可以绘制数据 我最初的想法是使用 as POSIXct test 但这似乎将日期时间截断为
  • 使用 JUnit 5 运行 Groovy 测试用例

    也许这很简单 但我在网上找不到任何示例 我想使用 JUnit 5 运行作为 Groovy 类实现的单元测试 我当前的设置似乎启动了 JUnit 5 但无法检测到测试用例 IntelliJ 识别测试 但无法运行它 如果我添加 Java 单元测
  • AttributeError:“模块”对象没有属性“分数”

    我在尝试使用该函数时遇到错误precision from nltk metrics scores 我尝试了许多不同的进口但没有成功 我查看了 python 目录中的文件 见下文 该函数就在那里 但只是 无法触及这个 那个 我在看 usr l
  • 如何指示 PowerShell 对 XmlSchemaSet 等 .NET 对象进行垃圾收集?

    我创建了一个 PowerShell 脚本 该脚本循环遍历大量 XML 架构 xsd 文件 并为每个文件创建一个 NETXmlSchemaSet对象 调用Add and Compile 向其中添加架构 并打印出所有验证错误 该脚本工作正常 但
  • 两次调用析构函数

    对于以下代码 include
  • 如何裁剪 Keras 中图层返回的值?

    如何剪辑返回的值Lambda layer 我尝试使用这个 from keras backend tensorflow backend import clip from keras layers core import Lambda mode
  • @font-face 被 IE7 忽略

    我创建了一个 font face css规则和所有使用的字体格式松鼠字体在我迄今为止测试过的所有浏览器上都可以正常工作 但在 IE7 上不行 字体似乎根本没有加载 您可以在以下位置实时查看该网站 http grupogamma social
  • 将程序集安装到 GAC 中

    我尝试使用以下命令在 GAC 中安装程序集new System EnterpriseServices Internal Publish GACInstall Foo dll 但我找不到安装在 c windows assembly gac m
  • 使用我的 Android 应用程序将文本标签发送到 Instagram

    我的应用程序拍摄照片并将其发送到 Instagram Facebook 和 Twitter 但我需要在 Instagram 上分享带有图片的文本 myappname 这是我用来发送照片的代码 Intent shareIntent new I
  • 渲染 @object 和 locals 与 render :partial

    我想传递一个局部变量 其中包含特定页面上的原点 该变量仅包含带有值的符号 当我使用这段代码时 它工作得很好 可以在部分中访问 origin 变量 render partial gt products collection gt produc
  • 如何在 Node 4.x 中使用 Promise?

    既然 ES6 在 Node 4 x 中正式成为标准 那么如何使用 Promises 呢 做模块 例如本机fs模块 自动与 Promise 一起工作 或者必须专门编写模块才能与 Promise 一起使用 你怎么知道 Promise 可以用于什
  • 三种颜色的三角形

    我正在尝试为这个问题编写代码 来源 https www codewars com kata insane coloured triangles train c 彩色三角形是由一行颜色创建的 每种颜色都是 红色 绿色或蓝色 连续行 每行少一种
  • C++11:std::locale::empty() 是一件事吗?

    尝试编译一些代码来自 StackOverflow 基本上是这些行 std wifstream wif filename wif imbue std locale std locale empty new std codecvt utf8
  • 为什么我不能在单个服务器请求中插入带有外键的记录?

    我正在尝试使用外键进行简单的插入 但似乎我需要使用db SaveChanges 对于每条记录插入 我怎样才能只使用一个db SaveChanges 在这个程序的最后 public static void Test using var ent
  • 多次导航至同一实体

    当有 2 个导航时 我遇到两个实体之间的连接问题 具体来说 我有以下课程 public class TableA public TableA ListBs new List
  • Zend Framework 2:在视图中获取匹配的路由

    我目前正在通过开发一个大致基于骨架应用程序的小型 MVC 应用程序来学习 ZF2 现在我正在尝试根据匹配的路由隐藏一些固定的 HTML 元素 仅作为示例 我不希望在登录阶段显示主菜单 我可以通过将切换参数作为控制器操作的返回值传递来轻松做到
  • 如何在polymer中设置动态Meta标签和Open Graph标签?

    我有一个聚合物节点站点 我一直在研究它 但不知道如何包含动态元标记和开放图标记 Jquery 无法工作 也无法使用polymer api 添加节点 因为它会在页面加载后添加所有标签 而 facebook 将无法读取这些标签 谷歌爬虫确实会渲
  • 如何在 Pygame 中根据角度移动精灵

    我在移动精灵时遇到问题 我可以毫无问题地在 x 轴和 y 轴上移动它们 我不知道如何才能按照某个角度移动它们 我的意思是 我正在尝试创建一个函数 其中包括我尝试移动的对象 其速度和方向 应以度为单位测量 就像是 MovingObject o
  • 在使用 Ant 编译的文件中找不到主类

    我在 Eclipse 中编译并运行我的程序 一切正常 但是当我用 Ant 打包它并运行它时 出现以下错误 Exception in thread main java lang NoClassDefFoundError org supercs