如何使用相同的lib进行编译并在Eclipse上运行?

时间:2018-05-17 13:56:38

标签: java maven compilation runtime-error nosuchmethoderror

我有一个作为java项目导入的maven项目。当我运行它时,我得到了

Handling error: NestedServletException, Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.lang.time.DateUtils.addDays(Ljava/util/Date;I)Ljava/util/Date;

使用this answer我得到了这一行:

[Loaded org.apache.commons.lang.time.DateUtils from file:/C:/Users/user/.m2/repository/commons-lang/commons-lang/2.0/commons-lang-2.0.jar]

但在pom.xml它是:

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

考虑到我在Java Build Path

上有这个库

enter image description here

enter image description here

我该如何解决这个问题?哪里可以保证比较我的运行与编译库?

修改

这是mvn dependency:tree -Dverbose -Dincludes=commons-lang

的输出
    [INFO] com.companyName.gestao.projectName:projectName-webapp:war:1.0.0-SNAPSHOT
    [INFO] \- com.companyName.gestao.projectName:projectName-business:jar:1.0.0-SNAPSHOT:compile
    [INFO]    +- com.companyName.commons.utils:companyName-commons-utils:jar:1.14.5:compile
    [INFO]    |  \- softdes:softdes-all:jar:1.6.23:compile
    [INFO]    |     \- commons-lang:commons-lang:jar:2.6:compile (version managed from 2.0)
    [INFO]    \- net.sf.jasperreports:jasperreports:jar:companyName-6.4.0.4:compile
    [INFO]       \- org.codehaus.castor:castor-xml:jar:1.3.3:compile
    [INFO]          +- org.codehaus.castor:castor-core:jar:1.3.3:compile
    [INFO]          |  \- (commons-lang:commons-lang:jar:2.6:compile - version managed from 2.0; omitted for duplicate)
    [INFO]          \- (commons-lang:commons-lang:jar:2.6:compile - version managed from 2.0; omitted for duplicate)

business子项目中运行相同的命令(与webapp项目相同的目录级别):

[INFO] com.companyName.gestao.projectName:projectName-business:jar:1.0.0-SNAPSHOT
[INFO] +- com.companyName.commons.utils:companyName-commons-utils:jar:1.14.5:compile
[INFO] |  \- softdes:softdes-all:jar:1.6.23:compile
[INFO] |     \- commons-lang:commons-lang:jar:2.0:compile

所以webapp取决于businesscompanyName-commons-utils依赖softdes-all,而commons-lang取决于webapp版本2.但commons-lang必须pom.xml使用<exclusion>版本2.6。

我可以通过更改commons-lang的依赖顺序来完成此操作吗?

第二次编辑

business依赖关系中将BUILD SUCCESS添加到 PS C:\workspace\projectName-dev\webapp> mvn dependency:tree -Dverbose -Dincludes=commons-lang [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Conciliador - webapp 1.0.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ conciliador-webapp --- [WARNING] Using Maven 2 dependency tree to get verbose output, which may be inconsistent with actual Maven 3 resolution [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.629s [INFO] Finished at: Thu May 17 13:21:08 BRT 2018 [INFO] Final Memory: 29M/494M [INFO] ------------------------------------------------------------------------ PS C:\workspace\projectName-dev\webapp> 之后,我运行了依赖关系树maven,如上所述。现在,除commons-lang之外,maven没有打印任何树,如下所示:

dependencyManagement

我发现DateUtils依赖项位于import React, {Component} from 'react'; import {Button, Dropdown, Form} from 'semantic-ui-react' import SimpleReactValidator from 'simple-react-validator'; import cookie from 'react-cookies' import {Redirect} from 'react-router-dom' const jsonData = require('../../../../../jsonData/data.json'); const dummyData = require('../../../../../jsonData/dummy.json'); import auth, { axiosInst as axios, removeElement, addElement, beforeSubmiteShaker, afterSubmiteShaker } from "../../../../helper"; import QuestionsFilters from '../../../../components/QuestionsFilters' import DropDown from '../../../../components/ui/Select/Select' const items = [ {value: 1, primaryText: 'Dhaval'}, {value: 2, primaryText: 'Dhavalu'}, {value: 3, primaryText: 'Dhavalaa'}, ] class RegisterCandidate extends Component { constructor(props) { super(props); this.state = { firstname: "", lastname: "", mobile_no: "", email: "", password: "", city_id: "", preference_list: [], medium: "", //how did u find us is_looking_for: "", affiliate: "", revert: "", emailExist: "", mobileExist: "", isLogin: false, historyRoute: "", }; this.validator = new SimpleReactValidator(); } componentDidMount() { this.props.fetchCities() this.props.fetchPreferences() } change(e) { this.setState({ [e.target.name]: e.target.value }) }; dropDownChange(e, {value, name}) { this.setState({ [name]: value }) } emailcheck(e) { if (this.validator.fieldValid('email')) { let uri = '/email/exists'; axios.get(uri, { params: {email: this.state.email} }) .then((response) => { this.setState({emailExist: response.data}); if (response.data.status != 'Failed') { removeElement("p[id='serv-error email-exist']") return axios.get('/droppedregistrations/add', { params: {email: this.state.email} }).then((response) => { console.log("Email Dropped " + response.data) }).catch((error) => { console.log('failed') }) } else { removeElement("p[id='serv-error email-exist']") addElement("#email", "serv-error email-exist", "This email already exists.") } }) .catch(error => { console.log('error Email') }) } } mobilecheck(e) { if (this.state.mobile_no != isNaN && this.state.mobile_no.length == 10) { let uri = '/number/exists'; axios.get(uri, { params: {mobile_no: this.state.mobile_no} }).then((response) => { this.setState({mobile_noExist: response.data}); if (response.data.status != 'Failed') { removeElement("p[id='serv-error mobile-exist']") return axios.get('/droppedregistrations/add', { params: {mobile_no: this.state.mobile_no} }).then((response) => { console.log("mobile dropped " + response.data) }).catch((error) => { console.log('failed') }) } else { removeElement("p[id='serv-error mobile-exist']") addElement("#mobile_no", "serv-error mobile-exist", "This mobile already exists.") } }) .catch(error => { console.log('You are experiencing slow internet please be patient and try again later') }) } } addUserSubmit(e) { e.preventDefault(); beforeSubmiteShaker("s_reg_submit", "shaker") if (this.validator.allValid()) { const userDetails = {//add data to a donstant to pot firstname: this.state.firstname, lastname: this.state.lastname, email: this.state.email, password: this.state.password, mobile_no: this.state.mobile_no, city_id: this.state.city_id, medium: this.state.medium, is_looking_for: this.state.is_looking_for, preference_list: this.state.preference_list, affiliate: this.state.affiliate } let uri = '/register/candidate'; axios.post(uri, userDetails) .then((response) => { this.setState({revert: response.data}); const gotBack = this.state.revert if (gotBack.status === 'Success') { cookie.remove('token') cookie.save('token', gotBack.token, {path: '/'}) if (cookie.load('token')) { this.setState({isLogin: true}) } else { console.log('Something went wrong while redirect.') } } }) .catch(error => { if (error.response.status === 422) { afterSubmiteShaker("s_reg_submit", "shaker") $.each(error.response.data.errors, function (index, value) { var errorDiv = '#' + index; $(errorDiv).after("<p id='serv-error' class='validation-message'>" + value + "</p>"); }); } }) } else { this.validator.showMessages(); this.forceUpdate(); afterSubmiteShaker("s_reg_submit", "shaker") } } render() { const { firstname, lastname, mobile_no, email, password, city_id, preference_list, medium, is_looking_for, affiliate, isLogin } = this.state; //to get the items in level of education let looking_for = jsonData.looking_for; var looking_fors = [] for (let i = 0; i < looking_for.length; i++) { looking_fors.push(looking_for[i]['value']); } if (isLogin) { return <Redirect to='/register/candidate/step2'/>; } else { return ( <section className="container mt-3"> {/*one click register section*/} <div className="row p-3"> <div className="col-md-6"> <div className="card text-center"> <div className="card-body"> <h3>Register Using</h3> <br/> <a href="/" className={"btn btn-block btn-lg btn-info"}> Register with Facebook</a> <a href="/google/redirect" className={"btn btn-block btn-lg btn-danger"}> Register with Google</a> <br/> </div> </div> </div> {/*end of one click register section*/} {/*manuel register section*/} <div className="col-md-6"> <div id="shaker" className="card"> <div className="card-body"> <h5 className="card-title">Register Candidate</h5> <Form onSubmit={this.addUserSubmit.bind(this)}> <Form.Field> <label>First Name*</label> <input name="firstname" id="firstname" value={firstname} onChange={e => this.change(e)} type="text" placeholder='Enter First Name*'/> {this.validator.message('first name', firstname, 'required|alpha')} </Form.Field> <Form.Field> <label>Last Name*</label> <input name="lastname" id="lastname" value={lastname} onChange={e => this.change(e)} type="text" placeholder='Enter Last Name'/> {this.validator.message('last name', lastname, 'required|alpha')} </Form.Field> <Form.Field> <label>Mobile No*</label> <input name="mobile_no" id="mobile_no" value={mobile_no} onBlur={this.mobilecheck.bind(this)} onChange={e => this.change(e)} type="text" placeholder='Enter mobile_no'/> {this.validator.message('mobile no.', mobile_no, 'required|phone|min:10|max:10')} </Form.Field> <Form.Field> <label>Email*</label> <input name="email" id="email" value={email} onBlur={this.emailcheck.bind(this)} onChange={e => this.change(e)} type="text" placeholder='Enter Email'/> {this.validator.message('email', email, 'required|email')} </Form.Field> <Form.Field> <label>Password*</label> <input name="password" id="password" value={password} onChange={e => this.change(e)} type="password" placeholder='Enter Password'/> {this.validator.message('password', password, 'required|min:6')} </Form.Field> <Form.Field> <label>City*</label> <Dropdown placeholder='Select City' id="city_id" name="city_id" search selection options={this.props.city_opt} value={city_id} onChange={this.dropDownChange.bind(this)}/> {this.validator.message('city', city_id, 'required|gt:0')} </Form.Field> <Form.Field> <label>Preference*</label> <Dropdown placeholder='Select Preference' id="preference_list" name="preference_list" search multiple selection options={this.props.preference_list_opt} value={preference_list} onChange={this.dropDownChange.bind(this)}/> {this.validator.message('preference', preference_list, 'required|max:3', false, {max: 'Maximum 3 preferences allowed'})} </Form.Field> <Form.Field> <label>How did you find us?*</label> <Dropdown placeholder='Please Select' id="medium" name="medium" search selection options={jsonData.medium} value={medium} onChange={this.dropDownChange.bind(this)}/> {this.validator.message('medium', medium, 'required')} </Form.Field> <Form.Field> <label>What are you looking for?*</label> <Dropdown placeholder='Please Select' id="is_looking_for" name="is_looking_for" search selection options={jsonData.looking_for} value={is_looking_for} onChange={this.dropDownChange.bind(this)}/> {this.validator.message('', is_looking_for, 'required|in:' + looking_fors)} </Form.Field> <Form.Field> <label>affiliate Code</label> <input name="affiliate" value={affiliate} onChange={e => this.change(e)} type="text" placeholder='Enter preference_list'/> </Form.Field> <Button id="s_reg_submit" className={"btn btn-block btn-lg"} type='submit'>Submit</Button> </Form> <QuestionsFilters/> </div> </div> </div> {/*end of manuel register section*/} <DropDown items={items}/> </div> </section> ) } } } export default RegisterCandidate; 内,如here所述,import React, {Component} from 'react'; import DropDownMenu from 'material-ui/DropDownMenu'; import MenuItem from 'material-ui/MenuItem'; const styles = { customWidth: { width: 200, }, }; class DropDownMenuSimpleExample extends Component { constructor(props) { super(props); this.state = {value: 1, items: ['abcd', 'efgh']}; } handleChange(event, index, value) { return this.setState({value}) } render() { let propItems = this.props.items return ( <DropDownMenu value={this.state.value} onChange={this.handleChange.bind(this)} style={styles.customWidth} autoWidth={false} > {(propItems !== null || propItems != 'undefined' ) ? (propItems).map((item, index) => <MenuItem key={index} value={1} primaryText="Custom height"/>) : (this.state.items).map((item, index) => <MenuItem key={index} value={1} primaryText="Custom width"/>)} </DropDownMenu> ); } } export default DropDownMenuSimpleExample 仍然从2.0版本Jar加载。可以做些什么?

1 个答案:

答案 0 :(得分:0)

正如@LuisMuñoz在评论中所述,我使用较旧的依赖项向所有可能的lib添加了排除项。即使这个Eclipse坚持使用它的旧版本。我去了项目属性&gt; Java构建路径&gt;订单和导出和顶部优先于我的新版依赖版本2.6。在此之后它起作用了。听起来像pom定义根本不重要,如果Eclipse配置有最后的话。