【问题标题】:Ant compile with javac Main Class not found未找到使用 javac Main Class 编译的 Ant
【发布时间】:2015-07-29 21:50:06
【问题描述】:

我已经在这里搜索过解决方案,但没有一个对我有用: 我有一个用 Ant 编写的构建脚本:

<project name="Musifx" basedir="." default="main">
<property name="src.dir" value="src"/>

<property name="build.dir" value="out"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="properties.file" value="${src.dir}/qs_musifx.properties"/>
<property name="lib.dir" value="lib"/>
<property name="main-class" value="quakk.musifx.main.Main"/>

<target name="clean">
  <delete dir="${build.dir}"/>
</target>

<target name="compile">
  <mkdir dir="${classes.dir}"/>
  <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpath="${lib.dir}/Logger.jar" includes="${lib.dir}/*.jar"/>
  <copy todir="${classes.dir}">
    <fileset dir="${src.dir}" excludes="**/*.java"/>
  </copy>
</target>

<target name="jar" depends="compile">
  <mkdir dir="${jar.dir}"/>
  <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
    <manifest>
        <attribute name="Main-Class" value="${main-class}"/>
    </manifest>
  </jar>
</target>
<target name="run" depends="jar">
  <java classname="${main-class}" fork="true"/>
</target>

<target name="clean-build" depends="clean,jar"/>

<target name="main" depends="clean,run"/>
</project>

我的文件夹结构是 ./quakk/musifx/main/ 我的包是 quakk.musifx.main

正如我所说,我尝试了此处发布的各种解决方案,但每次尝试在 Ant 中运行我的“主要”目标时,我都会收到以下错误

Fehler: Hauptklasse quakk.musifx.main.Main konnte nicht gefunden oder geladen werden

大致翻译为 Mainclass:quakk.musifx.main.Main 无法找到或加载。

我还尝试更改类路径或 Mainclass 的名称,并尝试将我的 main-class 属性更改为简单的“Main”或“quakk.musifx.main” 或在编译目标中包含类路径,但对我没有任何帮助。

顺便说一下,我使用的是 JDK 8,这是一个 JavaFX 应用程序

编辑:jar tvf Musifx.jar 的输出

0 Thu Jul 30 00:00:00 CEST 2015 META-INF/
139 Wed Jul 29 23:59:58 CEST 2015 META-INF/MANIFEST.MF
0 Wed Jul 29 23:59:58 CEST 2015 quakk/
0 Wed Jul 29 23:59:58 CEST 2015 quakk/musifx/
0 Wed Jul 29 23:59:58 CEST 2015 quakk/musifx/main/
425 Wed Jul 29 23:59:58 CEST 2015 qs_musifx.properties
1866 Wed Jul 29 23:59:58 CEST 2015 quakk/musifx/main/main.fxml
1076 Wed Jul 29 23:59:58 CEST 2015 quakk/musifx/main/styles.css

【问题讨论】:

    标签: java ant javafx


    【解决方案1】:

    我只需要更改compilejar 的目标:

    <target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}">
        <classpath>
            <pathelement path="${lib.dir}/Logger.jar"/>
        </classpath>
    </javac>
    <copy todir="${classes.dir}">
      <fileset dir="${src.dir}" excludes="**/*.java"/>
    </copy>
    </target>
    

    jar 目标

    <target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <zipgroupfileset dir="${lib.dir}" includes="Logger.jar" />
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
        </manifest>
    </jar>
    </target>
    

    现在它可以工作并编译到我的 jar 文件中,并且应用程序可以正常工作

    【讨论】:

      【解决方案2】:

      您正在尝试在不提供类路径的情况下运行您的主类。

      我建议改为:

      <target name="run" depends="jar">
        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
      </target>
      

      它将运行您刚刚构建的 JAR(因为它的清单中确实有一个 Main-Class 将运行它。

      【讨论】:

      • 你的意思是在罐子里目标?我用这个替换整个 jar Target 吗?
      • 它说它必须用fork="true"运行,所以我改变了,同样的错误出现了
      • 运行 ant 后是否存在 out/classes/quakk/musifx/main/Main.class 文件?
      • 是的,out/ 文件夹中存在所需的每个文件
      • 那么在 JAR 文件中呢?如果你做一个jar tvf Musifx.jar?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多