1

假设我们有一个 PrintTarget 类,里面有 main()。

我们可以构建/编译这样,以某种方式我们应该能够在 main.js 中发送 build-target-name 。当 main() 被调用时,它将打印构建目标名称。

我不想要目标名称同时构建。我们都知道该怎么做。我希望生成的 JAR 记住目标名称。假设我们创建了 jar printTarget.jar 并执行了 jar #>java printTarget.jar 我希望这个调用打印目标名称。

4

2 回答 2

4

要将数据从构建时传递到运行时,您需要将数据写入存储在 JAR 中的文件中,例如

<jar destfile="printTarget.jar">
  <fileset dir="${classes.dir}" />
  <manifest>
    <attribute name="Main-Class" value="com.example.Main" />
  </manifest>
  <!-- This is just a way to create a zip entry from inline text in the build
       file without having to <echo> it to a real file on disk first -->
  <mappedresources>
    <mergemapper to="com/example/buildinfo.properties"/>
    <string encoding="ISO-8859-1"># this is a generated file, do not edit
      targetname=custom-build-1
    </string>
  </mappedresources>
</jar>

然后你可以在你的主要方法中阅读

package com.example;
import java.io.*;
import java.util.Properties;

public class Main {
  public static void main(String[] args) throws Exception {
    Properties buildInfo = new Properties();
    InputStream is = Main.class.getResourceAsStream("buildinfo.properties");
    try {
      buildInfo.load(is);
    } finally {
      is.close();
    }

    System.out.println("Build target was " +
       buildInfo.getProperty("targetname", "<unknown>"));
  }
}

这应该打印

Build target was custom-build-1
于 2012-11-30T23:38:22.570 回答
1

听起来很奇怪!

通常你用 ant 或 maven 构建。(或带有 exlipse)但这超出了您的 java 代码。

因此,您在 ant(或 maven)脚本中打印构建目标。

在蚂蚁中:

<target name="jar">
    <echo>Building target: ${target}</echo>

...
</target>

还是您的意思是获取运行 main() 的 jar 文件的名称:

File jarFile = new File
(org.classes.main.class.getProtectionDomain()
.getCodeSource().getLocation().toURI());
System.out.println(jarFile.getName());
于 2012-11-30T22:50:03.473 回答