从代码动态创建eclipse中的JAR文件

时间:2014-07-23 19:48:11

标签: java eclipse maven jar

我目前正在开展 TESTING 游戏项目。以下是我的项目的详细信息。

这是我的第一个Maven项目,我真的对它的工作方法知之甚少。请帮助我!

1] GameProject - 是Eclipse中的Maven项目。该项目的主要目标是为第一人称射击游戏创建一个游戏玩家(也称为 bot )。当您运行此Java应用程序时,它将使用新的播放器运行游戏,其操作将由我在此项目中编写的代码确定。

它有很多java文件和一个主类。有一个名为 PlayerInfo.Java 的类,其中包含用于决定玩家在玩游戏时应该做什么的代码。它就像玩家的大脑。让我们说它有大约40个变量,它们决定了玩家的行为。

示例 - 类中的一个变量可能类似于 Player_HEALTH_Level = 50 。这意味着玩家应该拥有至少50%的生命值才能与其他玩家战斗。如果它小于此值,那么他/她应该找到一个健康包并增加该值。同样,我还有其他39个参数。

2] 测试项目 - 这也是一个maven项目。这是为了在游戏中测试我的玩家(机器人)性能。比如,他赢了多少次比赛,他收集的武器数量等等。

设计此项目的方式是,它需要 GameProject 的JAR文件的路径作为主方法中的输入。然后,它运行给定JAR的bot / player并在单独的文件中打印出游戏结果。

示例 - 在主方法中,我指定类似这样的东西

String playerJAR_Path =" C:\ Users \ Player \ Netbeans \ GameProject-one-SNAPSHOT-jar.jar"

注意: - 以上是GameProject JAR文件夹的路径。基本上,我只是将GameProject构建为" Maven Install"它会为我创建一个JAR。然后使用第二个Project上的路径地址。

希望这可以让您了解我的项目结构。

问题

真正的问题是我必须基本上运行我的GameProject大约500次并捕获结果。我正在使用遗传算法来演化播放器参数并随着时间的推移改进它们。

目前,我可以在我的TestingProject中使用for循环来循环500次迭代,它会为我执行500次GameProject。

为了应用遗传算法,在EACH迭代结束后,我修改了Player / bot行为中的参数(特别是在文件 PlayerInfo.Java 中)。对于迭代2运行,我可以更改 Player_HEALTH_Level = 48 的值,然后在第三次运行时更改为56,依此类推。

为了做到这一点,我需要在我的FOR循环中实现我的测试项目。

也许可能是这样的

*For int i=1 to 500 do ;
String playerJAR_Path = "C:\\Users\\Player\\Netbeans\\GameProject-one-SNAPSHOT-jar.jar";
Run the Testing();
Modify the parameters in PlayerInfo.Java (Inside GameProject)
Change the values of 40 Variables in that class.
Build the GameProject Project so that, it creates a UPDATED JAR File
End FOR;*

我真的很困惑,比如如何自动构建第一个项目,以及如何更改类变量的值。

任何人都可以帮我提一些如何实现同样的建议。我不介意以什么方式做到这一点。能够自动完成整个测试过程。

其他详细信息: 1.系统 - Windows 7,Intel Xeon 12核心处理器,24GB RAM,3 TB闪存驱动器。 2.对于For-Loop上的每次迭代,它产生一百万条记录(在Eclipse的控制台窗口中,对于for循环中的每次迭代,将包含一条百万行)。我还需要知道,如何将其写入文件,而不是泛滥控制台。 当我最初测试时,Eclipse挂起了Out of Heap Memory Error。然后我在eclipse INI文件中将所有RAM值增加到2GB。这不知何故设法不会因为内存错误而崩溃。

编辑 - 向问题添加代码。

public class PlayerInfo {
public int minDistanceToFollowEnemy = 200; // This is in UT Units. If Bot sees an enemy over this distance
    // He/she tries to follow him and attack.

public int probabilityToFollowEnemy = 50; // Distance between the bot and Enemy will be calculated in real time.
    //If the distance is lower, chasing priority is Higher.

public int probabilityOfFlagHolderReturn = 50; // If the Bot holds the Enemy flag, what's the probability that he/she
        //Runs to home base directly without being distracted to collect items, fight with enemies?

public int probabilityOfGettingEnemyFlag = 10; // If bot does not carries the enemy flag, it's probability to hunt for enemy flag.


public double maxDistanceToGetHealthPack = 1000 ; // If Bot finds a health pack within this distance && It needs a Health pack
           // Then It searches one and grabs it.

public int minHealthLevel = 30; // Min Health level before bot starts looking for Health Pack

public int probabilityToGetHealthPack=80; // Probability that Bot will Pick one health pack if it sees on its path/view.

public int probabilityToSelectItem = 8 ; //Based on the current Bot's view, what's the probability that it will select to choose the item.

}

GameProject中的主类PlayerBot.java

public static void main(String args [])抛出PogamutException {

AddNativeBot addbot = new AddNativeBot();
//addbot.addNativeBots(4);

// starts 2 or 4 CTFBots at once
// note that this is the most easy way to get a bunch of bots running at the same time
new UT2004BotRunner<UT2004Bot, UT2004BotParameters>(CTFBot.class, "PlayerInfo").setMain(true)
.startAgents(
        new CTFBotParams().setBotSkin("HumanMaleA.MercMaleC").setBotType(0).setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 1"))
        //,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleA").setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 2"))
        //,new CTFBotParams().setBotSkin("HumanMaleA.MercMaleA")    .setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 3"))              
        //,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 4"))
        //,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(1).setAgentId(new AgentId("Attacker 5"))
        //,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(1).setAgentId(new AgentId("Attacker 6"))
        );

}

// Project 2

public static String[] getArgs_CTF_2v2v1() {
        return new String[] {
                "-y", // MATCH TYPE
                "CTF", // CAPTURE THE FALG
                // GENERIC CONFIG
                "-u",
                "C:\\UT",
                "-h", // human-like-log
                "-r",
                "./results",
                "-n",
                "Test-CTF-2v2v1", // MATCH NAME
                "-s",
                "CTFServer",                
                // CUSTOM BOTS CONFIG
                "-a",
                "C:\\Users\\Project\\Downloads\\CTFbot\\target\\mavenproject1-1.0-SNAPSHOT.one-jar.jar;C:\\Users\\Project\\Downloads\\CTFbot\\target\\mavenproject1-1.0-SNAPSHOT.one-jar.jar",
                "-b",
                "CTFBot1;CTFBot2",
                "-l",
                "1;2",
                "-k",
                "HumanFemaleA.NightFemaleA;HumanFemaleA.NightFemaleA",
                "-i",
                "0;1",
                // NATIVE BOTS CONFIG
                "-c", // NATIVE BOT COUNT
                "2",
                "-d", // NATIVE BOT NAME
                "Native1;Native2",
                "-e", // NATIVE BOT SKILL
                "5;6",
                "-g", // NATIVE BOT TEAMS
                "0;1",
                // HUMANS CONFIG
                "-x",
                "1", // HUMAN COUNT
                "-z",
                "1",
                // CAPTURE THE FLAG SPECIFIC CONFIG
                "-m",
                "CTF-LostFaith",
                "-f",
                "1", // SCORE LIMIT
                "-t",
                "5", // TIME LIMIT
            };
    }

//主类

public static void main(String[] args) throws JSAPException {
        // -----------
        // FOR TESTING
        // -----------
        //args = getArgs_DM_2v2v1();        
        //args = getArgs_TDM_2v2v1();
        args = getArgs_CTF_2v2v1();     

        // --------------
        // IMPLEMENTATION
        // --------------

        initJSAP();

        header();

        readConfig(args);

        sanityChecks();

        switch (matchType) {
        case DM:
            executeDeathMatch();
            break;
        case TDM:
            executeTeamDeathMatch();
            break;
        case CTF:
            executeCaptureTheFlag();
            break;
        case DD:
            executeDoubleDomination();
            break;
        default:
            fail("Unsupported match type specified " + matchTypeName + " recognized as " + matchType.shortName + "[" + matchType.name + "].");
        }
    }

}

1 个答案:

答案 0 :(得分:1)

文本的圣墙。

好的,有几件事。仅仅因为Maven为你创造了一个罐子,并不意味着你必须使用罐子。你可以直接给这个班级打电话。

因此,您的测试将实例化该类,而不是尝试从命令行运行该类。

二。您不必直接修改变量的内部状态。我的建议是将更改保存到文件并让您的播放器读取文件。对于下一次迭代,您修改文件并再次运行播放器。

如果您有具体问题,请告诉我,我会改进答案。