出于调试原因和好奇心,我希望列出加载到特定类加载器的所有类.
看到类加载器的大多数方法都受到保护,实现我想要的最佳方法是什么?
谢谢!
我希望创建一个我的"目标"目录的zip存档($ {project.build.directory).使用maven-assembly-plugin似乎对我来说这样一个简单的任务有点过分(有点复杂 - 为什么我必须使用另一个文件,汇编描述符,用于这样的任务)我找不到看似更简单的maven- http://repo1.maven.org/maven2存储库中的zip-plugin.
有什么输入?
我有一个单例bean,它需要每次调用一个函数来返回对不同(新)原型bean的引用.我能想到的唯一方法是通过调用其getBean()方法以编程方式从BeanFactory/ApplicatioContext中检索新的原型bean实例.代码示例将遵循......
有一个更好的方法吗?只有通过配置,希望?(我个人怀疑有...)
<bean id="protoBean" scope="prototype"
class="com.blahblah.ProtoBean" />
<bean id="singletonBean"
class="com.blahblah.SingletonBean" />
public class ProtoBean {
....
}
public class SingletonBean {
private BeanFactory factory;
public ProtoBean dispense() {
return (ProtoBean) factory.getBean("protoBean");
}
....
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个规则引擎,它执行由条件结构确定的简单赋值.规则是XML格式的项目的先决条件.我已经将我的XML模式建模为类似于简单的代码块.我希望解析XML,然后将其转换为Java代码.然后,我希望在运行时编译(并运行)此代码.这样做意味着我的规则引擎不再充当解释器,而是执行本机Java字节代码.
我已经找到了解析阶段和或多或少的Java代码生成阶段.我现在想弄清楚最后阶段 - 运行阶段的编译.
遵循这个线程:编译为java字节码(不使用Java)我已经意识到以下可能的解决方案:
我希望能比较这些以及在运行阶段解决Java编译的其他建议.
我想将maven生命周期中的某些阶段分解为子阶段.我想控制从一个子阶段到另一个子阶段的执行流程,有点像与ant依赖关系.
例如,我想使用NSIS插件,以便在我的项目被打包到war文件之后,将我的项目打包到包阶段的安装程序中.我想在包装阶段做所有这些.
那可能吗?
谢谢
我们目前正在尝试移植一个非常(非常)大型项目,该项目使用ant构建到maven(同时也转移到svn).正在探索重塑项目结构的所有可能性,以最好地适应maven范式.
现在更具体一点,我遇到了分类器,并希望知道如何利用它们对我有利,同时避免使用"分类器反模式".
谢谢
来自:http://maven.apache.org/pom.html
分类器:您可能偶尔会在坐标上找到第五个元素,即分类器.稍后我们将访问分类器,但是现在只需知道这些类型的项目显示为groupId:artifactId:packaging:classifier:version.
和
分类器允许区分从相同POM构建但其内容不同的工件.它是一些可选的任意字符串 - 如果存在 - 将附加到版本号之后的工件名称.作为此元素的动机,请考虑一个项目,该项目提供针对JRE 1.5的工件,但同时也是一个仍支持JRE 1.4的工件.第一个工件可以配备分类器jdk15,第二个工件配备jdk14,以便客户端可以选择使用哪个.
分类器的另一个常见用例是需要将辅助工件附加到项目的主工件.如果浏览Maven中央存储库,您会注意到分类器源和javadoc用于部署项目源代码和API文档以及打包的类文件.
我确信我不是第一个遇到这种冲突的人.
我继承的代码执行以下操作:
org.w3c.dom.Document dom; // declaration
javax.xml.validation.Schema schema; // declaration
...
...
...
javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));
Run Code Online (Sandbox Code Playgroud)
其中...代表看似不重要/无关代码
使用JDK 6编译和运行代码可以工作(并且始终有......)
最近,我不得不将我公司其他地方编写的另一个组件集成到我的代码中.该组件绝对需要包含在类路径中xercesImpl-2.8.1.jar
我绝对需要这个第三方组件,但现在运行上面的代码不再有效,我得到以下内容:
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'Root'.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Validator.java:127)
Run Code Online (Sandbox Code Playgroud)
作为一个解决方案,我想也许以某种方式在自己的类加载器中屏蔽xercesImpl-2.8.1.jar,但是没有设法这样做,可能是因为缺乏类加载器知识或者可能是因为它不是要走的路.关于我的环境的另一件事,我的应用程序运行在tomcat 5.5和6 ...
顺便说一下调试时我注意到我跑的时候 dom.getImplementation()
xercesImpl-2.8.1.jar …我正在使用JAXB 2.0 JDK 6来将XML实例解组为POJO.
为了添加一些自定义验证,我已经将一个验证调用插入到属性的setter中,尽管它是私有的,但似乎unmarshaller不会调用setter但直接修改私有字段.
对我来说,每个unmarshall调用都会针对此特定字段进行自定义验证,这一点至关重要.
我该怎么办?
码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LegalParams", propOrder = {
"value"
})
public class LegalParams {
private static final Logger LOG = Logger.getLogger(LegalParams.class);
@XmlTransient
private LegalParamsValidator legalParamValidator;
public LegalParams() {
try {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
LegalParamsFactory legalParamsFactory = (LegalParamsFactory) webApplicationContext.getBean("legalParamsFactory");
HttpSession httpSession = SessionHolder.getInstance().get();
legalParamValidator = legalParamsFactory.newLegalParamsValidator(httpSession);
}
catch (LegalParamsException lpe) {
LOG.warn("Validator related error occurred while attempting to construct a new instance of LegalParams");
throw new IllegalStateException("LegalParams creation failure", lpe);
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 尽管警告会放弃我目前的行动方案,但我目前看不到更好的方法来解决我的问题.我必须 在运行时生成 Java代码,然后编译它,加载它并引用它.
问题是生成的代码导入已经由系统类加载器加载的代码(我想) - 也就是代码存在于我的类路径中的一个jar中.(我在Java 6上运行Tomcat 6 Web容器.)您可能会问自己为什么这是一个问题 - 我确定不知道 - 但事实是我遇到了编译错误:
/W:/.../parser/v0.5/AssignELParser.java:6:包com.xxx.yyy.zzz.configuration不存在
下面是一些关于互联网的例子,我定义了以下类:
class MemoryClassLoader extends ChainedAction {
private static final Logger LOG = Logger.getLogger(MemoryClassLoader.class);
private LoaderImpl impl;
private class LoaderImpl extends ClassLoader {
// The compiler tool
private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// Compiler options
private final Iterable<String> options = Arrays.asList("-verbose");
// DiagnosticCollector, for collecting compilation problems
private final DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
// Our FileManager
private final MemoryFileManager manager = …Run Code Online (Sandbox Code Playgroud) java compiler-construction code-generation runtime classloader
java ×7
classloader ×3
maven-2 ×3
plugins ×2
runtime ×2
compilation ×1
flow-control ×1
hierarchy ×1
jaxb ×1
jdk1.6 ×1
maven-3 ×1
phase ×1
pom.xml ×1
setter ×1
spring ×1
validation ×1
xerces ×1
xml ×1
zip ×1