ant - 使用 Gradle 构建 Frege 项目的 Jar

标签 ant gradle executable-jar frege

我想:

  • 使用 Frege 编程语言编写一段简单的“Hello World”代码,
  • 然后使用 Frege 编译器生成等效的 Java 源代码
  • 然后构建一个可执行的 Jar 文件以从命令行运行,
  • 前面的所有步骤都应该由 Gradle “控制”。

  • 我能够生成源代码(上一个列表中的项目 1. 和 2.),但我无法在输出中指定 Java 源代码的“包”结构,即我看不到 package Java 语句作为生成 Java 源代码中的第一行代码。我可以向 Frege 编译器指定将生成的代码放在哪里(通过 -d 参数)。

    我认为这就是为什么在构建可执行 Jar 然后启动它时,我看到类似错误的原因(根据 Gradle 任务的不同尝试),例如:no main manifest attribute .

    Frege 源代码保存在一个名为 HelloFrege.fr 的文件中。 ,生成的 Java 源代码位于名为 HelloFrege.java 的文件中(我验证该文件包含预期的 main 方法)。

    这是 Gradle“Jar 任务”的一个版本:
    //create a single Jar with all dependencies
    task fatJar(type: Jar) {
        manifest {
            attributes  'Implementation-Title': 'Hello Frege Jar Example',
                        'Implementation-Version': version,
                        'Main-Class': 'HelloFrege'
        }
        baseName = project.name + '-all'
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        with jar
    }
    

    这里有另一个版本的 Gradle “Jar” 任务:
    jar {
        manifest {
            attributes 'Main-Class': 'HelloFrege'
        }
    }
    

    我怎么解决这个问题?我想避免手动将包引用添加到自动生成的 Java 源代码文件中。

    最佳答案

    如果您在 Frege 中的模块名称不合格,例如 HelloWorld ,您将看不到在 Java 中生成的 package 语句。模块名将成为类名,包为空或默认包。

    如果您的模块名称是限定的,例如 foo.bar.HelloWorld ,然后 foo.bar将是包名和HelloWorld将是生成的 Java 源代码中的类名。

    规则是模块名的最后一部分成为类名,而限定符在生成的 Java 源代码中形成包名。

    关于ant - 使用 Gradle 构建 Frege 项目的 Jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705963/

    相关文章:

    android - 用ant制作apk文件

    android - Android Studio构建失败:Android资源链接失败,无法创建目录C:\tmp\

    gradle - gradle 项目中的路径配置

    maven - 如何在两个 nexus 存储库 (jenkins) 之间移动 Artifact ?

    java - 为什么 java.class.path 属性总是返回 jar 的位置?

    Java程序双击无法运行

    java - Apache Ant - 带有 "[java]"标记的程序输出

    java - ant 在 list 末尾添加新行

    java - 为什么 Junit 测试仅支持不完全重写 fork?

    java - ProcessBuilder对一个jar包中的一个可执行jar作为资源