1

その中に main() を持つクラス PrintTarget があるとします。

そのようにビルド/コンパイルできますか、何らかの形でメインの内部でビルドターゲット名を送信できるはずです。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 に答える