使用java.util.logging.Logger将一些日志输出到控制台,如下所示:
public static void main(String[] args) {
Logger logger = Logger.getLogger("test");
logger.info("Hello Wolrd!");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
FEB 16, 2012 10:17:43 AM com.abc.HelloWorld main
INFO: Hello World.
Run Code Online (Sandbox Code Playgroud)
这似乎没问题,但......
我们在所有Ant任务(内部标准)中使用java.util.logging.Logger,我们有一个大型的ant项目.完整周期的控制台输出可能大于300KB,其中我们自己的记录器输出至少达到50.
现在我不想看到有关Level.INFO输出的时间,类名和方法的信息.信息行也使得难以专注于自定义消息.
那么有没有办法从每个输出(或仅从每个Level.INFO输出)中删除第一行(时间戳,类和方法的信息)?
两个项目:产品(项目-A)和A(项目-B)的汽车基准项目.
在B的构建文件中,我们需要调用A的构建文件来运行构建和bundle-with-app-server过程,如下所示:
<ant antfile="${build-file-A}" inheritall="false" target="all" />
Run Code Online (Sandbox Code Playgroud)
而且,在项目B中,我们有许多使用java.util.logging(JDK Logging Framework)输出消息的Ant任务.
问题是,在该行之后,所有jdk记录器输出都消失了.
通过调试,我发现在项目A的构建文件初始化过程中,项目A中的静态定义的东西将运行LogManager.readConfiguration(InputStream),它会加载一个仅包含单个类的记录器配置的配置文件.
在期间readConfiguration,LogManager.reset()将被称为; 在期间reset,每个记录器的每个处理程序都将被删除.由于<ant>将目标构建文件加载到调用者的同一进程,因此将删除所有处理程序.
因此,除了可配置的类之外,由于缺少输出处理程序,使用jdk logger的每个其他类都无法输出消息.
我的问题是:
有没有办法解决这个问题,除了:
<exec>运行项目A的构建文件;readConfiguration()以便在<ant>调用后从默认配置文件中恢复默认的JDK日志记录设置.请注意,我无法修改项目A以防止出现此问题.
如果要调用要覆盖的类com.example.FooServlet并且这个类在jar中WEB-INF/lib/foo.jar,那么如何使用com.example.FooServlet另一个jar中调用的类来覆盖它,比如说bar.jar?
或者有没有办法确保bar.jar首先加载?
制作bar.jar一个模块是不行的,因为FooServlet从许多罐子里进口大量的类WEB-INF/lib.
正如我上面所说的,我试图bar.jar在一个模块中包含,但没有找到类或没有类def错误(记不清楚)作为FooServlet扩展/实现一些额外的类/接口在WEB-INF /中的第三方jar中库.
我不允许触摸foo.jar或任何已经存在的罐子WEB-INF/lib.
我正在尝试复制以_ $ {env} .xml结尾的根文件夹开始的所有目录下的文件,如果找到则从文件名中删除_ $ {env}或复制目录中存在的xml文件我不能让这个工作请帮忙.(可能我需要一个移动和映射器重命名,我不知道怎么不能把它们编织在一起.)
<target name="main">
<copy todir="qa-wprelease">
<fileset dir="bin-debug" includes="**/*.xml">
<or>
<filename name="*_${env}.xml"/>
<filename name="*.xml" />
</or>
</fileset>
</copy>
</target>
Run Code Online (Sandbox Code Playgroud) 为了简单地解释它,这里是一个例子:
在 build.xml 中,导入 local-db.xml。在local-db.xml 中,有一个名为“warmup”的目标,它使用task 调用第三个文件的一个目标——local-gr.xml。
所有公共属性和类路径定义都被导入并在 build.xml 中设置。
在 project.properties 中:
dest-dir=./destination
Run Code Online (Sandbox Code Playgroud)
在 build.xml 中:
<path id="gr-classpath"> ... </path>
<import file="local-db.xml" />
Run Code Online (Sandbox Code Playgroud)
在本地 db.xml 中:
<ant antfile="local-gr.xml" target="deploy" inheritAll="true" inheritRefs="true" />
Run Code Online (Sandbox Code Playgroud)
在 local-gr.xml 中,有两个这样的目标:
<target name="deploy">
<tar ....../>
<foreach list="${list1}" delimiter="," parallel="true" trim="true" param="item" target="deploy-single" />
</target>
<target name="deploy-single">
something using property ${dest-dir} and path "gr-classpath"
</target>
Run Code Online (Sandbox Code Playgroud)
现在问题来了:
属性${dest-dir}和路径“gr-classpath”可以在“deploy”中使用,因为我设置了inheritAll和inheritRefs,但不能在“deploy-single”中直接使用。当目标被 foreach 调用时,“继承”不会?
在 的帮助下,我设法将 ${dest-dir} 传递给“deploy-single”,但我没有找到任何方法将类路径引用“gr-classpath”传递给“deploy-single”。
我为解决它所做的工作是在“deploy-single”中再次声明,但我根本不喜欢它。
为什么会发生这种情况?我该怎么做才能让它更优雅?