1

我有一个简单的java类,它在“TMSCore”java项目中显示“等待”文本。

 package com.stock.bo;

    public class example {

        /**
         * @param args
         */
        public static void main(String[] args) {
            // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
             System.out.println("================================> waiting");
        }

    }

我创建了 TMSCore.jar 并将这个 example.class 设置为我的 jar 文件的入口点。

然后我在 C:\Jboss\jboss-as-7.1.1\modules\org\tms\main 中为这个项目创建了一个模块,并将 jar 粘贴到相同的路径中

然后我创建了 module.xml 并粘贴在同一路径中

模块.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.tms">
   <resources>
    <resource-root path="TMSCore.jar"/>
   </resources>
</module>

然后我在我的 webproject/web-inf 目录中创建了一个 jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="org.tms"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

当我使用包含上述 jboss-deployment-structure.xml 的战争启动服务器时,在我的控制台中它显示已部署的 TMSCore.jar

但是我的 jar 中的“等待”文本未显示在控制台上

我的要求是一旦jboss启动,我应该在我的控制台上得到“=================================>等待”

或者任何人都可以建议如何制作一个 jar 在启动 jboss 服务器时执行?

顺便说一句,我正在使用 JBOSS7.1

4

2 回答 2

2

不能运行 jar,但可以在单例中执行启动方法。

@Startup
@Singleton
 public class FooBean {

   @PostConstruct 
   void atStartup() { ... }

   @PreDestroy
   void atShutdown() { ... }

}

这将在应用程序启动和关闭时发生。我会从那里调用你需要的函数。

请参阅http://docs.oracle.com/javaee/6/tutorial/doc/gipvi.html

于 2013-05-06T15:11:58.247 回答
2

如果我是对的,那是因为 JBoss 不执行库,它只加载文件中包含的类jar。因此,放置一个 main 函数并生成一个可执行文件jar将无济于事。

如果您的目标是在服务器上拥有一个全局模块,我建议您进行以下修改:

  1. 创建模块(正如您已经完成的那样)
  2. 将其声明为依赖项jboss-deployment-structure.xml(正如您已经完成的那样)
  3. 将其声明为服务器上的全局模块,因此 JBoss 只会加载一次。编辑配置文件standalone.xml并修改部分:

    <subsystem xmlns="urn:jboss:domain:ee:1.0">
        <global-modules>
            <module name="org.tms" />
        </global-modules>
    </subsystem>
    

现在你有了一个只加载一次类的模块。我你只需要一个Example类的实例,我建议你使用一个单例:

public class Example {

    // The only one instance
    private static Example instance;

    // Private constructor to avoid creation of other instances of this class
    private Example()
    {
        System.out.println("================================> waiting");
    }


    public static Example getInstance()
    {
        if(instance == null)
        {
            instance = new Example();
        }
        return instance;
    }

}

然后在服务器上的所有项目中使用它

Example ex = Example.getInstance();

会给你现有的实例(或第一次创建一个)。

注意:我不能尝试,所以不能保证它会起作用。


编辑:也许对类的一个小修改Example也可以使它在类加载期间运行:

public class Example {

    // The only one instance
    private static Example instance = new Example();

    // Private constructor to avoid creation of other instances of this class
    private Example()
    {
        System.out.println("================================> waiting");
    }

    public static Example getInstance()
    {
        return instance;
    }

}

再次:未测试。

于 2013-05-02T21:48:54.553 回答