假设我们有一个PrintTarget类,其中包含main()。
我们可以构建/编译这样,以某种方式我们应该能够在main中发送build-target-name。当调用main()时,它将打印构建目标名称。
我不想要目标名称WHILE建设。我们都知道如何做到这一点。 我希望生成的JAR能够记住目标名称。 假设我们创建了jar printTarget.jar 并执行jar#> java printTarget.jar 我希望这个调用打印目标名称。
答案 0 :(得分: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
答案 1 :(得分:1)
听起来很奇怪!
通常你用ant或maven构建。 (或用exlipse) 但这不在你的java代码中。
所以你在ant(或maven)skript中打印构建目标。
在Ant:
<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());